TSQL:如何使用另一个相关表中的xml标记的值更新xml标记的值?
如何使用另一个相关表中的xml标记的值更新xml标记的值?TSQL:如何使用另一个相关表中的xml标记的值更新xml标记的值?
是这样的:
UPDATE v2
SET
[xml].modify ('replace value of (//TAG1/text())[1]
with "CAST(v1.[xml].query(''//TAG2'') AS NVARCHAR(MAX))"')
FROM
table2 v2,
table1 v1
WHERE
v2.id = v1.id
我不认为你可以在一个单一的步骤做到这一点 - 但你可以做的两个步骤,如果你的SQL Server 2008上:
DECLARE @NewValue NVARCHAR(50)
SELECT @NewValue = [xml].value('(//TAG2)[1]', 'NVARCHAR(50)')
FROM dbo.v1
WHERE id = 1
UPDATE dbo.v2
SET [xml].modify('replace value of (//TAG1/text())[1] with sql:variable("@NewValue")')
WHERE id = 1
在您的replace value of
XQuery中指定sql:variable
的能力是SQL Server 2008中的一项新功能 - 因此,如果您在2005年停滞不前,那么不幸的是,这将无法工作。
我对这个问题已经很晚了,但如果您希望将来“大规模更新”XML列,并且您在SQL 2005+中,则可以使用CTE来完成此操作:
WITH NewXmlData AS
(
SELECT v2.Id AS id
, CAST(v1.[xml].query('//TAG2') AS NVARCHAR(MAX)) AS NewValue
FROM table2 AS v2
INNER JOIN table1 AS v1 ON v2.id = v1.id
)
UPDATE v2
SET [xml].modify ('replace value of (//TAG1/text())[1]
with sql:column("NewXmlData.NewValue")')
FROM table2 AS v2
INNER JOIN NewXmlData AS nxd ON v2.id = nxd.id
感谢您的回答即使你迟到了。这完全符合我的需求。 – 2012-05-18 19:04:42
应该是正确答案!谢啦 :) – 2016-02-19 10:27:13
功能与sql:variable
也适用于2005服务器。你只需要把所有的建设纳入大括号:
修改( '取代的价值(// TAG1 /文())[1] {SQL:变量( “@的NewValue”)}')
有没有办法使它与“sql:variable”一起工作? – halfjust 2010-06-16 18:03:22
@halfjust:是的 - 请参阅我展示的方法。但我没有看到任何方法来做“大规模更新” - 你需要一个**变量**能够使用'sql:variable' - 你不能只有另一个XQuery表达式.... – 2010-06-16 18:32:39