如何在同一批处理语句中更新新添加的列

时间:2010-08-03 14:21:42

标签: sql sql-server-2008

在SQL Server 2008中,我想在表中添加一个列并立即更新它,但前提是它们之前没有创建过它们。如果之前已经创建了列,我不想运行更新。

IF NOT EXISTS (SELECT *
               FROM [INFORMATION_SCHEMA].[COLUMNS] 
            WHERE [TABLE_NAME] = 'SETTINGS' AND [COLUMN_NAME] = 'COLOR_SCHEME')
BEGIN
    ALTER TABLE [SETTINGS]
    ADD [COLOR_SCHEME] int NULL

    UPDATE [SETTINGS]
    SET [COLOR_SCHEME] = 1
END

在添加列之后放置“GO”不起作用,因为这不是一个完整的批处理语句,但是如果我尝试像这样运行它,我会收到错误“无效的列名'COLOR_SCHEME'。 “

有关如何在运行更新时使列存在的任何想法?

3 个答案:

答案 0 :(得分:5)

您可以尝试使用动态SQL代替alter语句:

DECLARE @SQL NVARCHAR(4000)
SET @SQL='ALTER TABLE [SETTINGS] ADD [COLOR_SCHEME] int NULL'
EXEC(@SQL)

答案 1 :(得分:2)

另一种可能性是跨批次保存IF标准:

CREATE TABLE ##Temp_Add_Color_Scheme (new_column BIT)
INSERT INTO ##Temp_Add_Color_Scheme VALUES (0)

IF NOT EXISTS (SELECT *
               FROM [INFORMATION_SCHEMA].[COLUMNS] 
               WHERE [TABLE_NAME] = 'SETTINGS' AND
                     [COLUMN_NAME] = 'COLOR_SCHEME')
BEGIN
    UPDATE ##Temp_Add_Color_Scheme SET new_column = 1

    ALTER TABLE [SETTINGS]
    ADD [COLOR_SCHEME] int NULL
END
GO

DECLARE @new_column BIT
SELECT @new_column = new_column FROM ##Temp_Add_Color_Scheme

IF (@new_column = 1)
BEGIN
    UPDATE [SETTINGS]
    SET [COLOR_SCHEME] = 1
END

DROP TABLE ##Temp_Add_Color_Scheme

答案 2 :(得分:0)

如果列的内容是固定的,您是否可以简单地在其中添加默认值而不是更新它?

ALTER TABLE [SETTINGS] 
    ADD [COLOR_SCHEME] int NULL 
    DEFAULT 1 WITH VALUES ;