【问题标题】:Have to map XML data into a SQL table?必须将 XML 数据映射到 SQL 表中吗?
【发布时间】:2020-01-06 11:14:11
【问题描述】:

我在存储过程中获取 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)

我想用 XML 数据中的值更新表 2;例如。 SystemKey = Table2.KEY AND Translation = Table2.Translation。

我可以在没有临时表和游标的情况下直接执行此操作吗?

【问题讨论】:

    标签: sql-server xml database stored-procedures cursor


    【解决方案1】:

    这就是你所追求的吗? (我不确定您尝试实现哪种类型的更新。如果您想要插入或更新,您可以对合并执行相同的操作)。

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2011-07-13
      • 2022-11-04
      • 2023-01-30
      • 1970-01-01
      相关资源
      最近更新 更多