【问题标题】:select into and overwrite选择并覆盖
【发布时间】:2012-11-15 14:38:39
【问题描述】:

我有这个创建备份表的 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 仅在 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 )+']'; 

【问题讨论】:

  • 没有这样的语法。为什么不能说DECLARE @sql NVARCHAR(MAX); IF OBJECT_ID('tablename_' + CONVERT ...) IS NOT NULL BEGIN SET @sql = N'DROP TABLE tablename_' + CONVERT ...; EXEC sp_executesql @sql; END
  • @AaronBertrand,完美,我如何将其标记为答案?谢谢!
  • 您可以使用解决问题的代码自行回答。我会投票赞成。

标签: sql-server select-into


【解决方案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)

非常感谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2020-01-27
    • 2020-08-10
    • 2011-03-28
    相关资源
    最近更新 更多