2016-09-27 54 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。 。 。啊,那些括号,叹了口气。 –