以下查询提供了一组包含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
有什么想法吗?是否使用光标做这种更新?行数将是几千行。
谢谢!
答案 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'