2

对于 Sql Server 2005 和 2008,我想检查给定表上是否已经存在列,如果不存在则创建它。这个新列应该有一个 ExistingColumn 的默认值。目前我需要使用动态 sql 来填充新列,因为 sql server 会抱怨语法错误。

这是当前的sql server代码:

IF NOT EXISTS (SELECT TOP 1 1 FROM sys.columns WHERE [name] = N'NewColumn' AND OBJECT_ID = OBJECT_ID(N'ExistingTable'))
BEGIN
    ALTER TABLE [dbo].[ExistingTable] ADD [NewColumn] VARCHAR(50) NULL;

    exec sp_executesql  N'UPDATE [dbo].[ExistingTable] SET NewColumn = ExistingColumn'

    ALTER TABLE [dbo].[ExistingTable] ALTER COLUMN  [NewColumn] VARCHAR(50) NOT NULL 
END
GO

有没有其他方法可以在不求助于动态 sql 的情况下解决这个问题?

4

2 回答 2

2

SQL Server 在您运行之前解析您的语句ALTER,并说“嘿,没有这样的列”。当您混合 DDL 和 DML 时,解析器不理解IF其他分支,也无法遵循事件序列 - 或预测事件将采用的序列以及运行时会发生什么分支。

延迟名称解析允许您访问尚不存在的对象,但不能访问已存在的对象上尚不存在的

因此,动态 SQL 似乎是您必须这样做的方式。

于 2013-03-07T19:12:42.977 回答
2

由于您无论如何都在创建列,因此您可以进行两个单独的批次。

    IF NOT EXISTS (SELECT TOP 1 1 FROM sys.columns WHERE [name] = N'NewColumn' AND OBJECT_ID = OBJECT_ID(N'ExistingTable'))
    BEGIN
        ALTER TABLE [dbo].[ExistingTable] ADD [NewColumn] VARCHAR(50) NULL;
    END
    GO
    IF EXISTS (SELECT TOP 1 1 FROM sys.columns WHERE [name] = N'NewColumn' AND OBJECT_ID = OBJECT_ID(N'ExistingTable'))
    BEGIN
        IF EXISTS (SELECT 1 FROM [dbo].[ExistingTable] WHERE NewColumn IS NULL)
        BEGIN
            UPDATE [dbo].[ExistingTable] SET NewColumn = ExistingColumn
            ALTER TABLE [dbo].[ExistingTable] ALTER COLUMN  [NewColumn] VARCHAR(50) NOT NULL 
        END
    END
    GO
于 2013-03-07T22:18:23.417 回答