我在 Workbench 中嘗試了這個查詢,想知道為什么第二次更新//b[2]沒有改變?
SET @xml = '<a><b>111</b><b>222</b><b>333</b></a>';
SELECT
UpdateXML(@xml, '/a/b[1]',
Concat('<e>', Extractvalue(@xml,'//b[1]'),'</e>')) INTO @xml;
SELECT
UpdateXML(@xml, '/a/b[2]',
Concat('<e>', Extractvalue(@xml,'//b[2]'),'</e>')) INTO @xml;
SELECT
UpdateXML(@xml, '/a/b[3]',
Concat('<e>', Extractvalue(@xml,'//b[3]'),'</e>')) INTO @xml;
SELECT @xml
結果如下:
----------------------------------------
| @xml |
----------------------------------------
|'<a><e>111</e><b>222</b><e>333</e></a>' |
----------------------------------------
中間<b>222</b>應該改成<e>222</e>. 我已經反復檢查了代碼中的每個字母。
請幫忙!...
uj5u.com熱心網友回復:
您的更新總是有效地將某些<b>標簽替換<e>為某個索引處的標簽。更改@xml是累積的。即,每條陳述句都接收@xml由前一條陳述句更新的值。
由于您正在 mutating @xml,因此第一條陳述句將第一個<b>標簽替換為<e>標簽。運行第一條陳述句后,@xml將如下所示:
<a><e>111</e><b>222</b><b>333</b></a>
第二條陳述句將從上述值開始,然后尋找并改變<b>仍然存在的第二個標簽(即最后一個):
<a><e>111</e><b>222</b><e>333</e></a>
最后一條陳述句將從上面的值開始并嘗試尋找第三個<b>標簽。由于只剩下一個<b>標簽(中間標簽),最后一條陳述句什么也不做。
這是一個作業版本:
SET @xml = '<a><b>111</b><b>222</b><b>333</b></a>';
SELECT
UpdateXML(@xml, '/a/b[1]',
Concat('<e>', Extractvalue(@xml,'//b[1]'),'</e>')) INTO @xml;
SELECT
UpdateXML(@xml, '/a/b[1]',
Concat('<e>', Extractvalue(@xml,'//b[1]'),'</e>')) INTO @xml;
SELECT
UpdateXML(@xml, '/a/b[1]',
Concat('<e>', Extractvalue(@xml,'//b[1]'),'</e>')) INTO @xml;
SELECT @xml
<b>在上面的版本中,代碼總是替換@xml. 以下是 的值的@xml更新方式:
- 在第一個陳述句之后:
<a><e>111</e><b>222</b><b>333</b></a> - 在第二條陳述句之后:
<a><e>111</e><e>222</e><b>333</b></a> - 在第 3 條陳述句之后:
<a><e>111</e><e>222</e><e>333</e></a>.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/490152.html
上一篇:與行同名的多個節點
