0

xmlValue在 SQL Server 表中有一个名为tbl1datatype的 XML 列nvarchar(max)

此列中的 xml 值如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<main>  
    <sub>
        <subMode>
            <name>abc</name>
            <address>add abc</address>
        </subMode>
        <subMode>
            <name>xyz</name>
            <address>add xyz</address>
        </subMode>
    <sub>
</main>

目前,名称“xyz”的地址值为“add xyz”。我需要将其更新为其他内容,例如“添加 xyz 更新”。

有什么简单的方法可以做到这一点。

我尝试使用如何根据 XML 中的值在 SQL 中更新 XML 中提供的解决方案,但它似乎很复杂。

有没有人有更简单的解决方案来实现这一目标?

4

1 回答 1

1

您已经被告知,您的 XML 应该存储为原生 XML。

你的问题是多方面的

  • 错误的数据类型(NVARCHAR(MAX)而不是XML
  • NVARCHAR声明UTF-8编码时不允许转换为 XML from
  • .modify适用

所以解决方法是临时表

模拟场景

DECLARE @tbl TABLE(ID INT IDENTITY, YourXmlAsString NVARCHAR(MAX));
INSERT INTO @tbl VALUES
('<?xml version="1.0" encoding="UTF-8"?>
<main>  
    <sub>
        <subMode>
            <name>abc</name>
            <address>add abc</address>
        </subMode>
        <subMode>
            <name>xyz</name>
            <address>add xyz</address>
        </subMode>
    </sub>
</main>');

--这将SELECT转换您的字符串 XML 并将结果存储为真正的 XML

SELECT ID
        ,CAST(REPLACE(YourXmlAsString,'UTF-8','UTF-16') AS XML) CastedToRealXML
        ,YourXmlAsString AS OriginalValue
INTO #tempTblKeepsCastedValue
FROM @tbl 
--WHERE SomeCriteria;

--您搜索xyz并将某些内容附加到现有值

DECLARE @SearchForName NVARCHAR(100)=N'xyz';
DECLARE @Append NVARCHAR(100)=N'add to the value';

UPDATE #tempTblKeepsCastedValue
SET CastedToRealXML.modify('replace value of 
                            (/main/sub/subMode[name/text()=sql:variable("@SearchForName")]/address/text())[1]
                            with concat((/main/sub/subMode[name/text()=sql:variable("@SearchForName")]/address/text())[1],sql:variable("@Append"))');

INNER JOIN--现在您使用临时表更新原始表

UPDATE t
SET YourXmlAsString=CAST(tmp.CastedToRealXml AS NVARCHAR(MAX))
FROM @tbl AS t
INNER JOIN #tempTblKeepsCastedValue AS tmp ON t.ID=tmp.ID;

--结果(和清理)

SELECT * FROM @tbl
DROP TABLE #tempTblKeepsCastedValue;

ID  YourXmlAsString
1   <main><sub><subMode><name>abc</name><address>add abc</address></subMode><subMode><name>xyz</name><address>add xyzadd to the value</address></subMode></sub></main>
于 2018-03-22T09:22:00.640 回答