我正在为我的dba创建一个脚本来运行。在开发中,我在现有表中添加了一个新列。当我运行以下脚本时,我在表上分离了ALTER和UPDATE。我试图将这些陈述合二为一。有什么建议?不确定这是否可行或我是在正确的轨道上。提前致谢!
当前正常运行的脚本:
if not exists(select * from sys.columns where Name = N'NewColumn' and
Object_ID = Object_ID(N'TableA'))
begin
ALTER TABLE dbo.TableA
ADD NewColumn BIT NULL
DEFAULT 0
end
if exists(select * from sys.columns where Name = N'NewColumn' and Object_ID = Object_ID(N'TableA'))
begin
UPDATE dbo.TableA
SET Newcolumn = CASE WHEN CodeID IN ('A','B') THEN 1 END
WHERE CodeID IN ('A','B')
end
尝试将ALTER和UPDATE合并为一个:
if not exists(select * from sys.columns where Name = N'NewColumn' and Object_ID = Object_ID(N'TableA'))
begin
ALTER TABLE dbo.TableA
ADD NewColumn BIT NULL
DEFAULT case CodeID
WHEN 'A' THEN 1
WHEN 'B' THEN 1
end
我收到以下错误: 在此上下文中不允许使用名称“CodeID”。有效表达式是常量,常量表达式和(在某些上下文中)变量。不允许使用列名。
答案 0 :(得分:0)
我实际上没有测试过这个,但我注意到你在工作脚本和非工作脚本中使用了不同的CASE语句语法。试试这个:
if not exists(select * from sys.columns where Name = N'NewColumn' and Object_ID = Object_ID(N'TableA'))
begin
ALTER TABLE dbo.TableA
ADD NewColumn BIT NULL
DEFAULT case WHEN CodeID = 'A' THEN 1 ELSE 0 END
end
但是如果你不能在列的默认值中引用另一列,那就不会让我感到惊讶。例如,当您插入新记录而未指定NewColumn
的值时会发生什么?在插入时,CodeID
没有值,因为该行尚不存在。
答案 1 :(得分:0)
好的,所以我做了更多的挖掘。以下解决了我的问题:
if not exists(select * from sys.columns where Name = N'NewColumn' and
Object_ID = Object_ID(N'TableA'))
begin
ALTER TABLE dbo.TableA
ADD NewColumn BIT NULL
DEFAULT 0 with Values
end
if exists(select * from sys.columns where Name = N'NewColumn' and Object_ID = Object_ID(N'TableA'))
begin
UPDATE dbo.TableA
SET Newcolumn = 1 WHERE CodeID IN ('A','B')
end
我让事情变得复杂了。为了组合更新,我必须尝试添加触发器。这适用于我需要做的事情。感谢。