必须将 XML 数据映射到 SQL table?
Have to map XML data into a SQL table?
我正在我的存储过程中获取 XML 数据,并希望通过映射这些值来更新相应的 SQL 服务器 table。
这是 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 数据中的值更新 table 2;例如。系统密钥 = Table2.KEY 和翻译 = Table2.Translation。
我可以在没有临时文件 table 和游标的情况下直接执行此操作吗?
这就是你想要的吗? (我不确定您要尝试实现哪种类型的更新。如果您想要插入或更新,您可以对合并执行相同的操作)。
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;
我正在我的存储过程中获取 XML 数据,并希望通过映射这些值来更新相应的 SQL 服务器 table。
这是 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 数据中的值更新 table 2;例如。系统密钥 = Table2.KEY 和翻译 = Table2.Translation。
我可以在没有临时文件 table 和游标的情况下直接执行此操作吗?
这就是你想要的吗? (我不确定您要尝试实现哪种类型的更新。如果您想要插入或更新,您可以对合并执行相同的操作)。
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;