未找到SQL列:在程序的前面添加

时间:2012-01-05 18:45:07

标签: sql sql-server-2008 stored-procedures alter-table

我正在使用SQL Server 2008.我有一个存储过程,其代码如下所示:

if not exists (select column_name from INFORMATION_SCHEMA.columns
where table_name = 'sample_table' and column_name = 'sample_column')    
    BEGIN
        ALTER TABLE Sample_Table
        ADD Sample_Column NVARCHAR(50)
    END

Update dbo.Sample_Table
SET Sample_Column = '1'

当我执行时,我收到“未找到列”错误,因为该列最初不存在于Sample_Table中 - 它已添加到过程中。解决这个问题的正确方法是什么?

我的解决方法(下面)是将update语句包装在EXEC语句中,以便强制它创建代码并在ALTER TABLE步骤之后执行。但是有更好的方法吗?

EXEC ('
Update dbo.Sample_Table
SET Sample_Column = ''1'' ')

1 个答案:

答案 0 :(得分:1)

如果您不喜欢您的解决方法,唯一的其他选择似乎是将您的DDL逻辑与DML逻辑分开,即一个SP将检查/创建列(也可能是其他列,如果需要),另一个SP集价值。

另一方面,您似乎只是将UPDATE语句用作为新创建的列提供默认值的方法。如果是这种情况,您可能会考虑一个完全不同的解决方案:创建DEFAULT约束(不需要UPDATE语句)。这里:

if not exists (select column_name from INFORMATION_SCHEMA.columns
where table_name = 'sample_table' and column_name = 'sample_column')    
    BEGIN
        ALTER TABLE Sample_Table
        ADD Sample_Column NVARCHAR(50) NOT NULL
        CONSTRAINT DF_SampleTable_SampleColumn DEFAULT ('1');

        ALTER TABLE Sample_Table
        ALTER COLUMN Sample_Column NVARCHAR(50) NULL;
    END

第二个ALTER TABLE命令仅用于删除NOT NULL限制,因为您似乎并不意味着您的列具有此限制。但如果你对NOT NULL没问题,那么就废弃第二个ALTER TABLE