2015-06-09 5 views
1

У меня есть таблица db с столбцом XmlProperties с данными в виде массива Serialized .NET. Вот пример:SQL Server XML Update Сериализованный массив на основе соединения XQuery

<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> 

Я хотел бы, чтобы обновить все элементы Value, где 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, LLC. "

Я пытался что-то вроде этого без толку:

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

Смежные вопросы