2016-09-27 72 views
0

我需要做一些更新和重命名列,如果有舊名稱來使用它,所以我想這樣做:重命名列不允許分批

GO 
IF NOT EXISTS (SELECT * FROM sys.columns WHERE Name = N'NewColumn' AND OBJECT_ID = OBJECT_ID(N'Potatoes')) 
BEGIN 
    UPDATE Potatoes SET OldColumn = 4 WHERE SomeColumn = 1 
    EXEC SP_RENAME 'dbo.Potatoes.OldColumn', 'NewColumn', 'COLUMN';  
END 
GO 

腳本正常工作第一次,但是當再次運行時,輸入錯誤找不到名爲OldColumn的列並返回錯誤。我如何使用一列並在一批中重命名?

回答

1

我認爲動態SQL將解決你的問題:

GO 
IF NOT EXISTS (SELECT * FROM sys.columns WHERE Name = N'NewColumn' AND OBJECT_ID = OBJECT_ID(N'Potatoes')) 
BEGIN 
    EXEC sp_executesql N'UPDATE Potatoes SET OldColumn = 4 WHERE SomeColumn = 1'; 
    EXEC SP_RENAME 'dbo.Potatoes.OldColumn', 'NewColumn', 'COLUMN';  
END 
GO 

這是一個編譯時的問題,因爲UPDATE期間批量的編譯階段得到一個未知的列錯誤。

+0

是的,運行字符串是一種方式,如果沒有其他的發現。我甚至想過'sp_executesql'。 – FLCL

+0

另外,只是'EXEC'...''將導致不正確的語法錯誤 – FLCL

+0

@FLCL。 。 。啊,那些括號,嘆了口氣。 –