Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将列添加到现有表中,并将默认值添加到不带动态sql的另一列中_Sql_Sql Server 2008_Sql Server 2005 - Fatal编程技术网

将列添加到现有表中,并将默认值添加到不带动态sql的另一列中

将列添加到现有表中,并将默认值添加到不带动态sql的另一列中,sql,sql-server-2008,sql-server-2005,Sql,Sql Server 2008,Sql Server 2005,对于SQLServer2005和2008,我想检查给定表中是否已经存在列,如果不存在,则创建列。此新列应具有现有列的默认值。目前,我需要使用动态sql来填充新列,因为SQLServer会抱怨语法错误 以下是当前sql server代码: IF NOT EXISTS (SELECT TOP 1 1 FROM sys.columns WHERE [name] = N'NewColumn' AND OBJECT_ID = OBJECT_ID(N'ExistingTable')) BEGIN A

对于SQLServer2005和2008,我想检查给定表中是否已经存在列,如果不存在,则创建列。此新列应具有现有列的默认值。目前,我需要使用动态sql来填充新列,因为SQLServer会抱怨语法错误

以下是当前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的情况下解决此问题?

sql Server正在运行
ALTER
之前解析您的语句,并说“嘿,没有这样的列。”解析器不理解
IF
和其他分支,也无法在混合使用DDL和DML时跟踪事件序列,也无法预测事件的顺序以及在运行时发生的分支

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


因此,动态SQL似乎是您必须使用的方法。

SQL Server在运行
ALTER
之前解析您的语句,并说“嘿,没有这样的列。”解析器不理解
IF
和其他分支,也无法在混合使用DDL和DML时跟踪事件序列,也无法预测事件的顺序以及在运行时发生的分支

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


因此,动态SQL似乎是您必须要做的事情。

因为您创建的是列,所以您可以执行两个单独的批处理

    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

由于您正在创建列,因此可以进行两个单独的批处理

    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

为什么您不喜欢动态sql作为解决方案呢?除了没有获得ManagementStudio的语法突出显示和自动完成之外,我对它没有任何问题。更奇怪的是,封面下到底发生了什么。啊,我通常用Print替换exec,然后将它粘贴到另一个窗口中,它不是brill,但最好是尝试找出附近的错误,你为什么不喜欢动态sql作为解决方案呢?除了没有语法高亮显示和ManagementStudio的自动完成之外,我对它没有任何问题。更奇怪的是,封面下到底发生了什么。啊,我通常用Print替换exec,然后将它粘贴到另一个窗口中,它不是brill,但最好是尝试找出附近的错误,意思是值得注意的是,如果您在没有运行第一批的情况下独自运行第二批,或者如果第一批出现错误,您仍然会得到错误;以上所做的只是让您不再使用动态SQL。因此,如果你在寻找可重复性,那么你就被卡住了。值得注意的是,如果你在没有运行第一批的情况下独自运行第二批,或者如果第一批出现错误,你仍然会得到错误;以上所做的只是让您不再使用动态SQL。所以如果你在寻找可重复性,那么你就被卡住了。