2015-06-09 72 views
1

我有一個帶有XmlProperties列的數據庫表,數據以Serialized .NET數組的形式存在。這裏有一個例子:基於複合XQuery的SQL Server XML更新序列化數組

<ArrayOfKeyValueOfstringanyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
    <KeyValueOfstringanyType> 
    <Key>CompanyName</Key> 
    <Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:string">Company A</Value> 
    </KeyValueOfstringanyType> 
    <KeyValueOfstringanyType> 
    <Key>CompanyUrl</Key> 
    <Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:string" /> 
    </KeyValueOfstringanyType> 
</ArrayOfKeyValueOfstringanyType> 

我想更新其中Key = "CompanyName"Value = "Company A"set Value = "Company A, LLC."有在此列其他鍵/值對所有價值要素所以這就是爲什麼我需要更新只適用於該鍵/值組合。

我能夠查詢和使用此查詢得到的結果:

WITH KeyValues 
AS (SELECT 
    Id, 
    key_value.value('./*:Key[1]', 'NVARCHAR(MAX)') AS [key], 
    key_value.value('./*:Value[1]', 'NVARCHAR(MAX)') AS [value] 
FROM dbo.MyTable 
CROSS APPLY XmlProperties.nodes('/*:ArrayOfKeyValueOfstringanyType/*:KeyValueOfstringanyType[*:Key="CompanyName" and *:Value="Company A"]') AS N (key_value)) 
SELECT 
    * 
FROM KeyValues 

不過,我似乎無法弄清楚如何同過濾邏輯適用於.modify語句來代替「公司A「與」A公司「。」

我已經試過這樣的事情無濟於事:

UPDATE dbo.MyTable 
SET XmlProperties.modify('replace value of (/*:ArrayOfKeyValueOfstringanyType/*:KeyValueOfstringanyType/*:Value[../*:Key="CompanyName" and ../*:Value="Company A"]) with "Company A, LLC"') 

任何人有一個優雅的解決方案嗎?我覺得我很接近,但還沒有破解它。

回答

1

你可以試試這個方法:

declare @xml XML = '<ArrayOfKeyValueOfstringanyType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
    <KeyValueOfstringanyType> 
    <Key>CompanyName</Key> 
    <Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:string">Company A</Value> 
    </KeyValueOfstringanyType> 
    <KeyValueOfstringanyType> 
    <Key>CompanyUrl</Key> 
    <Value xmlns:d3p1="http://www.w3.org/2001/XMLSchema" i:type="d3p1:string" /> 
    </KeyValueOfstringanyType> 
</ArrayOfKeyValueOfstringanyType>' 

SET @xml.modify(' 
    replace value of 
    (/*:ArrayOfKeyValueOfstringanyType 
    /*:KeyValueOfstringanyType[*:Key="CompanyName" and *:Value="Company A"] 
    /*:Value 
    /text() 
    )[1] 
    with "Company A, LLC" 
') 

SQL Fiddle

注意replace value of需要你的XPath的結果限制爲一個簡單類型。在上面的例子中看到,尾部/text()表示xpath返回簡單類型string,然後()[1]將字符串限制爲只返回到一個實例。

+1

真棒,工作就像一個魅力!感謝您的詳細解答。 – anderly