在默认值中使用CASE表达式

时间:2015-02-12 21:25:43

标签: tsql syntax sql-server-2008-r2

我正在为我的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”。有效表达式是常量,常量表达式和(在某些上下文中)变量。不允许使用列名。

2 个答案:

答案 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  

我让事情变得复杂了。为了组合更新,我必须尝试添加触发器。这适用于我需要做的事情。感谢。