将列添加到现有表中,并将默认值添加到不带动态sql的另一列中
对于SQLServer2005和2008,我想检查给定表中是否已经存在列,如果不存在,则创建列。此新列应具有现有列的默认值。目前,我需要使用动态sql来填充新列,因为SQLServer会抱怨语法错误 以下是当前sql server代码:将列添加到现有表中,并将默认值添加到不带动态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
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。所以如果你在寻找可重复性,那么你就被卡住了。