我有这个SQL Server代理,它创建一个备份表,执行此操作:
DECLARE @date datetime, @insert_cmd varchar(1000)
SET @date =GETDATE()
set @insert_cmd = 'select * into [tablename_'+CONVERT(varchar(100), @date, 112 )+'] from tableA'
exec (@insert_cmd)
麻烦的是,select * into table只有在表不存在时才有效。有没有办法改变它,插入到tablename _....而不关心,只是在必要时覆盖?
我已经尝试过使用sql检查表是否存在,执行类似的操作:
IF OBJECT_ID ('tablename', 'U') IS NOT NULL DROP tablename;
问题在于如何定位这些引号以便它们能够构建添加到表名的日期/时间?我尝试了一些变化,但没有一个已经淘汰了:
/* errors with quotations: */
set @del_cmd = 'IF OBJECT_ID ('[tablename_'+CONVERT(varchar(100), @date, 112 )+']', 'U') IS NOT NULL DROP [tablename_'+CONVERT(varchar(100), @date, 112 )+']';
答案 0 :(得分:1)
完全归功于@aaronBertrand,这是我最终得到的代码:
DECLARE @insert_cmd varchar(MAX), @del_cmd NVARCHAR(MAX), @date datetime
SET @date =GETDATE()
IF OBJECT_ID('tablename_' + CONVERT(varchar(100), @date, 112 ) ) IS NOT NULL
BEGIN
SET @del_cmd = N'DROP TABLE tablename_' + CONVERT(varchar(100), @date, 112 );
EXEC sp_executesql @del_cmd;
END
SET @insert_cmd = 'select * into tablename_'+CONVERT(varchar(100), @date, 112 )+'] from TableA'
EXEC (@insert_cmd)
非常感谢你!