2014-12-19 85 views
4

我想使用下面的代碼重命名SQL Server 2008 R2中的表;在SQL中重命名錶時使用表名中的變量

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

exec sp_rename 'LM_SM_Billing_and_Send_Data', '[email protected]' 

我的意圖是重命名附加當前日期的表。

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

回報20141219

但是當我運行的重新命名它的名稱表;

[email protected] 

,而不是插入日期

我想知道是否有可能把它重新命名爲;

LM_SM_Billing_and_Send_Data_20141219 

通過使用表名中的變量。

我一直在使用googling很多東西似乎指向使用動態SQL,但我從來沒有使用過它,不知道什麼語法會得到我期待的結果。

+2

你就不能像'設置@name = 'LM_SM_Billing_and_Send_Data_' + @ date'然後'EXEC sp_rename 'LM_SM_Billing_and_Send_Data',@ name'? –

+1

SQL不會執行字符串插值。您似乎認爲它會查看「LM_SM_Billing_and_Send_Data_ @ date''並查看」@ date「並對其執行操作。不。 –

回答

4

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

+0

這對於重命名THANKYOU來說非常合適。稍後在腳本中,我想刪除已重命名爲日期的表,但是,drop table @myNewName失敗,錯誤爲'expect',',ID或QUOTED_ID'。有任何想法嗎? – Sadie

+0

@Ben好點。增加了一些附加信息。 – Dan

+0

@Sadie本評論末尾的鏈接可能會解決您的新問題,如果不是的話,我會建議您搜索動態sql以及「t-sql drop table variable name」。 http://dba.stackexchange.com/questions/39627/how-to-drop-tables-using-a-variable-in-sql-server – Dan

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_'[email protected]+' 
      from LM_SM_Billing_and_Send_Data' 

exec sp_executesql @sql 

Drop table LM_SM_Billing_and_Send_Data