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

时间:2014-12-19 22:30:49

标签: 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'

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

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

返回20141219

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

LM_SM_Billing_and_Send_Data_@date  

而不是插入日期

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

LM_SM_Billing_and_Send_Data_20141219

使用表名中的变量。

我一直在谷歌搜索相似的东西似乎指向使用动态SQL,但我从来没有使用过它,也不确定语法是什么来获得我想要的结果。

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

使用Dynamic 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