2016-05-13 52 views
0

下面的查詢給出了一組具有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

是固定在該列所有行上的ImageType = Original? –

+0

設置[壞習慣踢 - 把NOLOCK無處不在](http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/) - 它是***不推薦***在任何地方使用 - 恰恰相反! –

+0

不,它不是固定的。我將不得不檢查它是否具有ImageType = Original,並且只更改這些行。謝謝! – Jyina

回答

1

最好的辦法是將停止在一列中存儲多個值和規範數據庫,這樣你就不會遇到這樣的問題。

除此之外,您可以嘗試使用REPLACE(),但您需要非常小心,以免發生意外更改與您的字符串匹配的字符串部分。

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

可能工作,但如果該屬性可以出現在字符串的末尾(沒有尾隨分號),那麼它可能會失敗。在某些情況下,如果在「=」和屬性/值之間存在空格,它也可能失敗。如果它可能是沒有前導分號的第一個屬性,它也可能失敗。可能還有其他一些可能的失敗情況 - 這就是爲什麼這不是你應該如何存儲你的數據。

-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' 
+1

如果「原始」恰好出現在列的其他任何位置,這將導致一些相當大的問題。 –

+0

@TomH它可以被修改顯然取代; ImageType =原始; – SQLChao

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=直到結束後,會出現第一個分號添加的一切。