如何更新一组行的列?

时间:2016-05-13 18:34:30

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

以下查询提供了一组包含3列的行。

Select 
    c.CaseID, i.ImageID, i.ImagePath
From 
    tblCase c WITH (NOLOCK)
inner join  
    tblName n WITH (NOLOCK) on c.CaseID = n.CaseID 
inner join 
    tblImage i WITH (NOLOCK) on n.NameID = i.NameID
where 
    n.NameCode = '70'

ImagePath列将包含这样的数据,并带有半冒号分隔值。

ImageID=3215;FilePath=\2016\5\13\test.tif;ImageType=Original;PageNumber=1

需要将ImageType值更改为"复制"对于从查询返回的所有行,如下所示。

ImageID=3215;FilePath=\2016\5\13\test.tif;ImageType=duplicate;PageNumber=1

有什么想法吗?是否使用光标做这种更新?行数将是几千行。

谢谢!

3 个答案:

答案 0 :(得分:1)

最好的办法是停止在一个列中存储多个值并规范化数据库,这样就不会遇到这样的问题。

除此之外,您可以尝试使用REPLACE(),但是您必须非常小心,不要无意中更改恰好与您的字符串匹配的字符串部分。

REPLACE(ImagePath, ';ImageType=Original;', ';ImagetType=Duplicate;')

可能有效,但如果该属性可以出现在字符串的末尾(没有尾随的分号),那么它可能会失败。如果" ="之间有空格,它也可能会失败。和某些情况下的属性/值。如果它可能是没有前导分号的第一个属性,它也可能失败。可能还有其他一些可能的失败案例 - 这就是为什么你不应该如何存储你的数据。

答案 1 :(得分:1)

这是一个尝试:

declare @s varchar(max) = 'ImageID=3215;FilePath=\2016\5\13\test.tif;ImageType=original;PageNumber=1'

select substring(@s, 0, charindex('imagetype=', @s)) + 'ImageType=duplicate' +
       substring(@s, charindex(';', @s, charindex('imagetype=',@s)), len(@s))

http://rextester.com/edit/AVQO58898

描述:取一切直到imagetype=并向其添加ImageType=duplicate并添加从imagetype=之后的第一个分号到结束的所有内容。

答案 2 :(得分:-2)

使用REPLACE

UPDATE i
SET i.ImagePath = REPLACE(i.ImagePath, ';ImageType=Original;', ';ImageType=duplicate;')
From tblCase c WITH (NOLOCK)
inner join tblName n WITH (NOLOCK) on c.CaseID = n.CaseID 
inner join tblImage i WITH (NOLOCK) on n.NameID = i.NameID
where n.NameCode = '70'