我有一个带有 XML 列的表,
我想更新 xml 以插入属性或更改属性值(如果属性已存在)。
假设起始 xml 是:
插入:
UPDATE Table
set XmlCol.modify('insert attribute att {"1"} into /d[1]')
改变:
UPDATE Table
set XmlCol.modify('replace value of /d[1]/@att with "1"')
如果属性已存在,则插入将失败;如果属性不存在,则替换将失败。
我尝试使用“if”,但我认为它不起作用,出现错误:“XQuery [modify()]:‘attribute’附近的语法错误,预期为‘else’。”
如果尝试
UPDATE Table
set XmlCol.modify('if empty(/d[1]/@att)
then insert attribute att {"1"} into /d[1]
else replace value of /d[1]/@att with "1"')
目前,我将 xml 选择到变量中,然后使用 T-SQL 对其进行修改,然后使用新的 xml 更新列,这需要我锁定事务中的行,并且对于数据库来说可能更昂贵。
据我所知,你不能用单一语句来做到这一点。您可以使用存在()方法 http://msdn.microsoft.com/en-us/library/ms189869.aspx通过两个更新语句来完成此操作。
DECLARE @TestTable TABLE
(
Id int,
XmlCol xml
);
INSERT INTO @TestTable (Id, XmlCol)
VALUES
(1, '<d att="1" />'),
(2, '<d />'),
(3, '<d att="3" />');
SELECT * FROM @TestTable;
UPDATE @TestTable
SET XmlCol.modify('replace value of /d[1]/@att with "1"')
WHERE XmlCol.exist('(/d[1])[not(empty(@att))]') = 1;
UPDATE @TestTable
SET XmlCol.modify('insert attribute att {"1"} into /d[1]')
WHERE XmlCol.exist('(/d[1])[empty(@att)]') = 1;
SELECT * FROM @TestTable;
最终选择的输出是:
Id XmlCol
----------- -------------------
1 <d att="1" />
2 <d att="1" />
3 <d att="1" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)