2012-06-19 35 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