2012-06-19 76 views
1

我意識到這在語法上很糟糕,但我想它有點解釋我正在嘗試做什麼。實質上,我有一個批處理作業每天早上在一張小桌子上運行,並且作爲規格的一部分,我需要在每個報告可以訪問的每個負載之前創建一個備份。如何通過datetime生成表名?

我至今是:

select * 
into report_temp.MSK_Traffic_Backup_ + getdate() 
from property.door_traffic 

我怎樣才能讓這個功能還是應該我認爲這是做一個更好的辦法?

+0

其實,使用一個exec()並作爲字符串執行是一個很好的方法呢? – Codingo

+0

yes - 將您的sql編譯爲字符串變量,然後執行它。另一種選擇是使用單個備份表,但在新列中包含日期時間,然後繼續添加到一個表中。 –

+1

我實際上想用一個備份表來處理這個問題,但原始表格的結構很可能會在不久的將來發生一些規律性的變化,所以很難有一些固定的邏輯來做到這一點,而不冒險不捕獲新的字段(imo選擇一個更可行的解決方案) – Codingo

回答

3
DECLARE @d CHAR(10) = CONVERT(CHAR(8), GETDATE(), 112); 

DECLARE @sql NVARCHAR(MAX) = N'select * 
into report_temp.MSK_Traffic_Backup_' + @d + ' 
from property.door_traffic;'; 

PRINT @sql; 
--EXEC sys.sp_executesql @sql; 

現在,你可能還需要添加一些邏輯使得腳本免疫錯誤,如果在某一天,例如運行多次

DECLARE @d CHAR(10) = CONVERT(CHAR(8), GETDATE(), 112); 

IF OBJECT_ID('report_temp.MSK_Traffic_Backup_' + @d) IS NULL 
BEGIN 
    DECLARE @sql NVARCHAR(MAX) = N'select * 
    into report_temp.MSK_Traffic_Backup_' + @d + ' 
    from property.door_traffic;'; 

    PRINT @sql; 
    --EXEC sys.sp_executesql @sql; 
END 

當你高興的邏輯和要執行的命令,只是交換PRINTEXEC之間的意見。

+0

任何想法爲什麼打印會正常工作,但執行會失敗?我收到錯誤消息,名稱'select ...'不是有效的標識符。 – branwen85

+0

@ branwen85可能是因爲你說的是​​'EXEC @ sql'而不是'EXEC sys.sp_executesql @sql;' –

+0

謝謝你的工作! – branwen85

0

我不知道你是否在尋找這個。

DECLARE @date datetime, @CMD varchar(1000); 
SET @date = CONVERT(VARCHAR(10), GETDATE(), 105) 
SET @cmd = 'SELECT * INTO [dbo.T_TABLE_Backup_' + replace(cast(@date as varchar(11)),' ','_')+'] FROM dbo.T_TABLE' 
print @cmd; 
+0

@Tony感謝您的格式化 – dekdev