SQL Server:定义变量

时间:2011-09-14 02:12:57

标签: sql sql-server

我有一张桌子:

ID Code1 Code2 Result
 1  2201  123
 2  1474  173
 3  5478  103
 4  4147  748
 5  4147  123

我想填充结果,以便首先在ID = 3&amp;中生成<cat> 4 然后在下一次更新中,它应该在ID = 4&amp;中生成<dog>。 5,现在因为ID 4已经<cat>,所以它必须保留此消息并添加新的<dog>。 注意:我必须这样做两(2)个更新语句。 预期结果:

ID Code1 Code2 Result
 1  2201  123  NULL
 2  1474  173  NULL
 3  5478  103  <cat>
 4  4147  748  <cat> <Dog>
 5  4147  123  <dog>

这是我尝试的显然是错误的,请帮助

declare @error1 varchar(100)
set @error1 = '<Cat>'
update #tblA
set error = @error1
from #tblA
where ID in (3,4)

declare @error2 varchar(100)
set @error2 = '<Dog>'
update #tblA
set error = @error1 +'+'+@error2 
from #tblA
where id in (4,5) 

谢谢!

3 个答案:

答案 0 :(得分:4)

试试这个:

UPDATE MyTable
SET [Result]= ISNULL([Result],'') + '<Cat>'
WHERE ID IN (3,4);


UPDATE MyTable
SET [Result]= ISNULL([Result],'') + '<Dog>'
WHERE ID IN (4,5);

答案 1 :(得分:4)

为什么必须在两个更新语句中?

UPDATE dbo.MyTable
  SET [Result] = COALESCE([Result], '')
    + CASE WHEN ID IN (3,4)
    AND [Result] NOT LIKE '%<Cat>%'
    THEN '<Cat>' ELSE '' END
    + CASE WHEN ID IN (4,5)
    AND [Result] NOT LIKE '%<Dog>%'
    THEN '<Dog>' ELSE '' END
WHERE ID IN (3,4,5);

答案 2 :(得分:1)

第二次更新不需要知道关于第一次实际执行的操作的任何特殊内容,只是为了保留列的值(可以清除它以不执行整个'+'的操作)。事实上,第一种可以用同样的方式编写。

declare @error1 varchar(100)
set @error1 = '<Cat>'
update #tblA
set error = @error1
from #tblA
where ID in (3,4)

declare @error2 varchar(100)
set @error2 = '<Dog>'
update #tblA
set error = COALESCE(error, '') +'+'+@error2 
from #tblA
where id in (4,5)