在 SQL 中重命名表时使用变量作为表名的一部分

5

我正在试图使用以下代码来重命名SQL Server 2008 R2中的表:

declare @date varchar(8)
set @date = convert( varchar(8), getdate(), 112)

exec sp_rename 'LM_SM_Billing_and_Send_Data', 'LM_SM_Billing_and_Send_Data_@date'

我的意图是将表格重命名为当前日期的附加。

select convert( varchar(8), getdate(), 112)

返回 20141219

但是当我运行重命名时,它会给表格命名;

LM_SM_Billing_and_Send_Data_@date  

不是插入日期

我想知道是否可以将其重命名为:

LM_SM_Billing_and_Send_Data_20141219

通过在表名中使用变量。我已经搜索了很多信息,似乎要使用动态SQL,但我从来没有用过,也不确定语法是什么,以获得我想要的结果。

2
你不能像这样做吗:set @name = 'LM_SM_Billing_and_Send_Data_' + @date,然后执行 exec sp_rename 'LM_SM_Billing_and_Send_Data', @name 吗? - Jonathan Leffler
1
SQL不支持字符串插值。你似乎认为它会查找'LM_SM_Billing_and_Send_Data_@date'中的@date并对其进行操作。但实际上不会。 - John Saunders
2个回答

6
您在此遇到的问题,正如John Saunders在他的评论中所指出的那样,SQL不会将您的变量值替换为参数。(字符串内插)
当试图解决这个问题时,您可能会遇到另一个问题,即尝试在过程调用中进行拼接。以下代码也不会起作用。 exec sp_rename 'LM_SM_Billing_and_Send_Data', 'LM_SM_Billing_and_Send_Data_' + @date 以上代码错误的原因是,参数可以是变量或常量,而不是上面所示的表达式。如果我们声明@myNewName并将所需的值设置为该变量,则可以将其传递给该过程。
请尝试一下这个方法:
declare @date varchar(8)
set @date = convert( varchar(8), getdate(), 112)

declare @myNewName varchar(255) = 'LM_SM_Billing_and_Send_Data_' + @date

exec sp_rename 'LM_SM_Billing_and_Send_Data', @myNewName

在继续使用SQL参数时,这可能是一个很好的参考:http://msdn.microsoft.com/en-us/library/ms189260(v=sql.105).aspx


这个重命名的部分完美地运行了,谢谢。但是在脚本的后面,我想删除我已经用日期重命名的表格,但是 drop table @myNewName 失败了,错误提示是“期望'.'、ID或QUOTED_ID”。有什么想法吗? - Sadie
@Sadie,这条评论末尾的链接可能会解决你的新问题,如果不行的话,我建议搜索动态SQL和“T-SQL删除表变量名”。http://dba.stackexchange.com/questions/39627/how-to-drop-tables-using-a-variable-in-sql-server - Dan
非常感谢您的帮助,我找到了解决方案;声明sql nvarchar(max) set sql = 'drop table '+ myNewName exec sp_executesql sql。其中sql和myNewName是变量,但是这个编辑器不允许我添加@。 - Sadie
@Sadie 很高兴听到那对你有帮助! - Dan

0
使用动态 Sql将变量附加到新表名。
使用select * into语法将数据从旧表复制到新表,此部分必须动态完成。
最后删除旧表。
declare @date varchar(8),
set @date = convert( varchar(8), getdate(), 112)


set @sql ='select * into LM_SM_Billing_and_Send_Data_'+@date+' 
           from   LM_SM_Billing_and_Send_Data'

exec sp_executesql @sql

Drop table LM_SM_Billing_and_Send_Data

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接