Как установить переменную в операторе UPDATE, а затем использовать эту переменную в операторе xml .modify ()? - PullRequest
2 голосов
/ 05 августа 2020

Вот некоторые демонстрационные данные, и то, что я предполагаю, будет выглядеть так:

CREATE TABLE #lookup_table (
    lookup_key VARCHAR(10),
    lookup_value VARCHAR(10)
);

INSERT INTO #lookup_table ( lookup_key, lookup_value )
    VALUES
        ( 'key1', 'value1' ),
        ( 'key2', 'value2' ),
        ( 'key3', 'value3' ),
        ( 'key4', 'value4' ),
        ( 'key5', 'value5' );

CREATE TABLE #dest_table (
    lookup_key VARCHAR(10),
    xml_data XML
);

INSERT INTO #dest_table (lookup_key, xml_data)
    VALUES
        ('key1', '<root><value /></root>'),
        ('key2', '<root><value /></root>'),
        ('key3', '<root><value /></root>'),
        ('key4', '<root><value /></root>'),
        ('key5', '<root><value /></root>')

-- Code in question --
DECLARE @value VARCHAR(10);

UPDATE #dest_table
SET @value = LT.lookup_value,
    xml_data.modify('insert text{sql:variable("@value")} into (./root/value)[1]')
FROM #dest_table DT
INNER JOIN #lookup_table LT
ON DT.lookup_key = LT.lookup_key;

SELECT * from #dest_table;

Из моих исследований это должно работать, но по какой-то причине @value всегда установлен в NULL, и узел не обновляется:

lookup_key  xml_data
key1        <root><value /></root>
key2        <root><value /></root>
key3        <root><value /></root>
key4        <root><value /></root>
key5        <root><value /></root>

Если я добавлю ВЫХОД и последую за запросом с помощью SELECT @value, мы увидим, что переменная действительно устанавливается - отображается последняя запись в таблице - но OUTPUT равен NULL:

DECLARE @value VARCHAR(10);

UPDATE #dest_table
SET @value = LT.lookup_value,
    xml_data.modify('insert text{sql:variable("@value")} into (./root/value)[1]')
OUTPUT @value
FROM #dest_table DT
INNER JOIN #lookup_table LT
ON DT.lookup_key = LT.lookup_key;

SELECT @value

Снимок экрана SQL Вывод Server Management Studio:

Снимок экрана с выходными данными SQL Server Management Studio

1 Ответ

1 голос
/ 05 августа 2020

@ GSerg предложил альтернативное решение, которое отлично работает - исключите переменную и используйте sql: column ("LT.lookup_value") вместо sql: variable ().

UPDATE #dest_table
SET xml_data.modify('insert text{sql:column("LT.lookup_value")} into (./root/value)[1]')
FROM #dest_table DT
INNER JOIN #lookup_table LT
ON DT.lookup_key = LT.lookup_key;

Предполагая, что другие тоже, мне все еще очень интересно понять, почему решение, указанное в вопросе, не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...