我意识到这在语法上很糟糕,但我想它有点解释我正在尝试做什么。实质上,我有一个批处理作业每天早上在一张小桌子上运行,并且作为规格的一部分,我需要在每个报告可以访问的每个负载之前创建一个备份。如何通过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