我意識到這在語法上很糟糕,但我想它有點解釋我正在嘗試做什麼。實質上,我有一個批處理作業每天早上在一張小桌子上運行,並且作爲規格的一部分,我需要在每個報告可以訪問的每個負載之前創建一個備份。如何通過datetime生成表名?
我至今是:
select *
into report_temp.MSK_Traffic_Backup_ + getdate()
from property.door_traffic
我怎樣才能讓這個功能還是應該我認爲這是做一個更好的辦法?
我意識到這在語法上很糟糕,但我想它有點解釋我正在嘗試做什麼。實質上,我有一個批處理作業每天早上在一張小桌子上運行,並且作爲規格的一部分,我需要在每個報告可以訪問的每個負載之前創建一個備份。如何通過datetime生成表名?
我至今是:
select *
into report_temp.MSK_Traffic_Backup_ + getdate()
from property.door_traffic
我怎樣才能讓這個功能還是應該我認爲這是做一個更好的辦法?
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
當你高興的邏輯和要執行的命令,只是交換PRINT
和EXEC
之間的意見。
我不知道你是否在尋找這個。
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;
@Tony感謝您的格式化 – dekdev
其實,使用一個exec()並作爲字符串執行是一個很好的方法呢? – Codingo
yes - 將您的sql編譯爲字符串變量,然後執行它。另一種選擇是使用單個備份表,但在新列中包含日期時間,然後繼續添加到一個表中。 –
我實際上想用一個備份表來處理這個問題,但原始表格的結構很可能會在不久的將來發生一些規律性的變化,所以很難有一些固定的邏輯來做到這一點,而不冒險不捕獲新的字段(imo選擇一個更可行的解決方案) – Codingo