我正在使用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'' ')
答案 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
。