在SQL中重命名表时,在表名中使用变量

Sad*_*die 4 sql sql-server sql-server-2008-r2

我正在尝试使用下面的代码重命名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'
Run Code Online (Sandbox Code Playgroud)

我的目的是使用附加的当前日期重命名表.

select convert( varchar(8), getdate(), 112)
Run Code Online (Sandbox Code Playgroud)

返回20141219

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

LM_SM_Billing_and_Send_Data_@date  
Run Code Online (Sandbox Code Playgroud)

而不是插入日期

我想知道是否有可能将其重命名为;

LM_SM_Billing_and_Send_Data_20141219
Run Code Online (Sandbox Code Playgroud)

通过使用表名中的变量.

我一直在谷歌搜索相似的事情似乎指向使用动态SQL,但我从来没有使用它,不知道什么语法将得到我正在寻找的结果.

Dan*_*Dan 5

您在此处遇到的问题,正如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
Run Code Online (Sandbox Code Playgroud)

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