Нужно отобразить данные XML в таблицу SQL? - PullRequest
0 голосов
/ 06 января 2020

Я получаю данные XML в своей хранимой процедуре и хочу обновить соответствующую таблицу SQL Server путем сопоставления значений.

Это пример кода XML:

DECLARE @xmlData XML = '<NewDataSet>
      <Table>
        <SystemKey>India</SystemKey>
        <Translation>Bharat</Translation>
      </Table>
      <Table>
        <SystemKey>UAE</SystemKey>
        <Translation>United Arab Emirates</Translation>
      </Table>
      <Table>
        <SystemKey>Afghanistan</SystemKey>
        <Translation>Afghanistan</Translation>
      </Table>
      </NewDataSet>'

:

SELECT 
    t.c.value('(SystemKey/text())[1]', 'NVARCHAR(MAX)') AS [SystemKey],
    r.c.value('text()[1]', 'NVARCHAR(MAX)') AS Translation
FROM 
    @xmldata.nodes('NewDataSet/Table') AS t(c)
CROSS APPLY 
    t.c.nodes('*[local-name(.) != "SystemKey"]') AS r(c)

Я хочу обновить таблицу 2, указав значения из XML данные; например. SystemKey = Table2.KEY AND Translation = Table2.Translation.

Могу ли я сделать это напрямую без временной таблицы и курсора?

1 Ответ

0 голосов
/ 06 января 2020

Это то, что вы ищете? (Я не был уверен, какого типа обновление вы пытались достичь. Вы можете сделать то же самое с объединением, если хотите вставить или обновить).

DECLARE @xmlData XML = '<NewDataSet>
      <Table>
        <SystemKey>India</SystemKey>
        <Translation>Bharat</Translation>
      </Table>
      <Table>
        <SystemKey>UAE</SystemKey>
        <Translation>United Arab Emirates</Translation>
      </Table>
      <Table>
        <SystemKey>Afghanistan</SystemKey>
        <Translation>Afghanistan</Translation>
      </Table>
      </NewDataSet>';

WITH Translations
AS
(
    SELECT 
        t.c.value('(SystemKey/text())[1]', 'NVARCHAR(MAX)') AS [SystemKey],
        r.c.value('text()[1]', 'NVARCHAR(MAX)') AS Translation
    FROM 
        @xmldata.nodes('NewDataSet/Table') AS t(c)
    CROSS APPLY 
        t.c.nodes('*[local-name(.) != "SystemKey"]') AS r(c)
)
UPDATE t2 
    SET t2.Translation = t.Translation 
FROM Table2 AS t2
INNER JOIN Translations AS t
ON t.SystemKey = t2.SystemKey;
...