TSQL: Как я могу обновить значение тега xml значением тега xml из другой связанной таблицы? - PullRequest
6 голосов
/ 16 июня 2010

Как я могу обновить значение тега 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

Ответы [ 3 ]

9 голосов
/ 27 ноября 2011

Я довольно поздно отвечаю на этот вопрос, но если вы хотите «массово обновить» столбец 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
2 голосов
/ 16 июня 2010

Я не думаю, что вы можете сделать это за один шаг - но вы можете сделать это за два шага, если вы используете 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

Возможность указать sql:variable в вашем replace value of XQuery - это новая функция в SQL Server 2008 - поэтому, если вы застряли в 2005 году, к сожалению, это не сработает.

0 голосов
/ 17 июля 2013

Функция с sql:variable также работает на 2005 Server.Вам просто нужно поместить всю конструкцию в фигурные скобки :

modify ('заменить значение (// TAG1 / text ()) [1] на {sql: variable ("@ NewValue«)} ')

...