SQL 服务器 XML 基于复合 XQuery 更新序列化数组
SQL Server XML Update Serialized Array based on compound XQuery
我有一个数据库 table,它有一个 XmlProperties 列,其中的数据以序列化 .NET 数组的形式出现。这是一个例子:
<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."
此列中还有其他 Key/Value 对,所以这就是我需要更新的原因仅适用于 Key/Value 组合。
我可以使用此查询查询并获得结果:
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 语句以将 "Company A" 替换为 "Company A, LLC."
我试过类似的方法但没有用:
UPDATE dbo.MyTable
SET XmlProperties.modify('replace value of (/*:ArrayOfKeyValueOfstringanyType/*:KeyValueOfstringanyType/*:Value[../*:Key="CompanyName" and ../*:Value="Company A"]) with "Company A, LLC"')
有人有一个优雅的解决方案吗?我觉得我已经接近了,但还没有破解它。
你可以这样试试:
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"
')
请注意 replace value of
要求您将 xpath 结果限制为 一个简单类型 。看到上面的例子,尾随/text()
表示xpathreturns简单类型string
,然后()[1]
限制字符串只返回一个实例
我有一个数据库 table,它有一个 XmlProperties 列,其中的数据以序列化 .NET 数组的形式出现。这是一个例子:
<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."
此列中还有其他 Key/Value 对,所以这就是我需要更新的原因仅适用于 Key/Value 组合。
我可以使用此查询查询并获得结果:
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 语句以将 "Company A" 替换为 "Company A, LLC."
我试过类似的方法但没有用:
UPDATE dbo.MyTable
SET XmlProperties.modify('replace value of (/*:ArrayOfKeyValueOfstringanyType/*:KeyValueOfstringanyType/*:Value[../*:Key="CompanyName" and ../*:Value="Company A"]) with "Company A, LLC"')
有人有一个优雅的解决方案吗?我觉得我已经接近了,但还没有破解它。
你可以这样试试:
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"
')
请注意 replace value of
要求您将 xpath 结果限制为 一个简单类型 。看到上面的例子,尾随/text()
表示xpathreturns简单类型string
,然后()[1]
限制字符串只返回一个实例