2015-12-21 51 views
-1

如果我運行此:SQL選擇查詢返回5,448行,更新查詢影響93,205行,但實際上沒有更新?

SELECT * 
FROM [myDB].[dbo].[content] 
where content_html like '%<images>%<img src=''/'' alt=''''>%</img>%</images>%' 

它返回5,448行。

那些空的圖像標籤打破了我在Ektron中的拉力 - 我們現在的CMS。他們建議我更換那些空圖像標籤與

所以我做了這個更新查詢:

UPDATE [myDB].[dbo].[content] 
SET content_html=REPLACE(CONVERT(VARCHAR(MAX), content_html),'%<images>%<img src=''/'' alt=''''>%</img>%</images>%','<images></images>') 

它返回此:(93205行(S)的影響)

但實際並沒有任何改變。我用一條特定的記錄試了一下,它說它受到了影響,但數據保持不變。

+2

只是爲了安全起見 - 你還記得提交嗎? – Mureinik

+3

您需要第一個查詢中的where子句來限制第二個查詢中更新的記錄數。其次,你能否在預期之前和之後給我們一些樣本?正如@Mureinik所說,您可能會離開交易。 – ps2goat

+2

您是否期待'replace'與'%'做模式匹配?我不認爲這是正常的字符串 –

回答

0

首先,從第一個查詢您的where子句從第二丟失:

其次,除非你想更換整個領域,你不想領導,並在您REPLACE語句結尾通配符符號。我不知道,如果你甚至可以使用通配符語句在替換命令 - 它不作爲任何微軟文檔中的一個例子,我讀過和幾個谷歌搜索沒有取得什麼:

UPDATE [myDB].[dbo].[content] 
SET content_html=REPLACE(CONVERT(VARCHAR(MAX), content_html),'<images>%<img src=''/'' alt=''''>%</img>%</images>','<images></images>') 
where content_html like '%<images>%<img src=''/'' alt=''''>%</img>%</images>%' 

編輯:

一個非常簡單的方法來測試,這將是:

SELECT content_html as [Original], REPLACE(CONVERT(VARCHAR(MAX), content_html),'%<images>%<img src=''/'' alt=''''>%</img>%</images>%','<images></images>') as [Replaced] 
FROM YourTable 
WHERE content_html like '%<images>%<img src=''/'' alt=''''>%</img>%</images>%' 

該查詢會給你原值 - 只在符合記錄和 - 和你正在創建的替代值你的表情。如果兩列不同,它就可以工作。如果它們相同,則不會,您需要使用其他代碼才能達到所需的結果。

最後編輯:

我測試了一個REPLACE只適用於文字字符串。您的通配符在您的替換函數中不起作用,您將需要非常複雜的SQL或應用程序代碼來實現您的目標。應用程序路線指數更好,所以那樣做!祝你好運!

0

您的更新語句沒有WHERE子句。這意味着它將在每一行上運行。即使content_html中的數據沒有更改,UPDATE語句也會將其重寫回表中。爲什麼?因爲這就是你告訴它要做的事情。

您將需要使用這隻會影響您需要的5448行:

UPDATE [myDB].[dbo].[content] 
SET content_html=REPLACE(CONVERT(VARCHAR(MAX), content_html),'%<images>%<img src=''/'' alt=''''>%</img>%</images>%','<images></images>') 
where content_html like '%<images>%<img src=''/'' alt=''''>%</img>%</images>%' 

但是,你仍然不會做任何事情,因爲REPLACE()函數是一個字符串文字替換。它不知道LIKE使用的通配符。因此,查詢是模式匹配以查找要更新的行,但它不會每個都找到content_html中的文字字符串%<images>%<img src='/' alt=''>%</img>%</images>%,而REPLACE()函數可能永遠找不到。

SQL Server中沒有內置的正則表達式替換函數。有other options,但我不認爲他們中的任何一個對你特別有用。您可能可以使用一系列PATINDEX()調用來查找<images><img src='/' alt=''></images>,使用一些比較來確定<img標記是否在這些標記內,然後使用STUFF(),但不知道您的數據我沒有了解這種方法的效果。

使用真正的正則表達式替換的最簡單方法可能是將字段選擇到DataTable,從C#或PowerShell應用正則表達式,然後再合併所做的更改。