【问题标题】:Insert the xml data into the sql table in stored procedure在存储过程中将xml数据插入到sql表中
【发布时间】:2019-04-10 07:18:48
【问题描述】:

我想在存储过程中将 XML 数据插入到 sql 表中。我想插入 CNAME 和 AMOUNT 值。如何使用下面的 xml 实现这一点?

<ENTITY>
<CNAME>
<NAME>FGGFGFGF</NAME>
</CNAME>
<AMOUNT>
<AMOUNT1></AMOUNT1>
<AMOUNT2>67052549.33</AMOUNT2>
</AMOUNT>
<CNAME>
<NAME>FGGFGFGF</NAME>
</CNAME>
<AMOUNT>
<AMOUNT1></AMOUNT1>
<AMOUNT2>67052549.33</AMOUNT2>
</AMOUNT>
</ENTITY> 
INSERT INTO Table1(NAME,AMOUNT1, AMOUNT2) SELECT t.c.value('(NAME)[1]', 'varchar(50)') AS NAME, d.c.value('(AMOUNT1) 
[1]', 'varchar(50)') AS AMOUNT1, d.c.value('(AMOUNT2)[1]','varchar(50)') as 
AMOUNT2 FROM @xmlData.nodes('/ENTITY') m(c) CROSS APPLY m.c.nodes(N'CNAME') 
t(c) CROSS APPLY m.c.nodes(N'AMOUNT') d(c)

【问题讨论】:

  • 可能是这个的副本:stackoverflow.com/questions/50562028/…
  • 不一样,我试过了,就像我使用了两个 CROSS APPLY 函数然后它循环了两次......
  • 如果你能把你的 sql 查询放出来就好了,这样它就可以更清楚地说明它到底有什么问题。
  • 我用查询编辑器更新了
  • 使用 SQL Server 很难处理 XML。我发现使用另一种编程语言来读取 xml 并存储到数据库中更容易做到。

标签: sql-server xml


【解决方案1】:

这应该会得到你想要的结果,一定要检查数据类型

DECLARE @XML AS XML= N'
<ENTITY> 

<CNAME> 
<NAME>FGGFGFGF</NAME> 
</CNAME> 
<AMOUNT> 
<AMOUNT1></AMOUNT1> 
<AMOUNT2>67052549.33</AMOUNT2> 
</AMOUNT> 

<CNAME> 
<NAME>FGGFGFGF</NAME> 
</CNAME> 
<AMOUNT> 
<AMOUNT1>
</AMOUNT1> 
<AMOUNT2>67052549.33</AMOUNT2> 
</AMOUNT>

</ENTITY> '
SELECT   nme.ROWID
        ,nme.NAME
        ,amt.AMOUNT1
        ,amt.AMOUNT2
FROM 
    (
        SELECT   TRY_CONVERT(NVARCHAR(50),nme.value('(NAME/text())[1]',       'VARCHAR(MAX)'))      AS NAME
                ,ROW_NUMBER() OVER (ORDER BY T.nme)                                                 AS ROWID    
        FROM    @XML.nodes('ENTITY/CNAME') AS T(nme) 
    )nme
    LEFT OUTER JOIN
    (
        SELECT   TRY_CONVERT(MONEY,amt.value('(AMOUNT1/text())[1]',           'VARCHAR(MAX)'))      AS AMOUNT1
                ,TRY_CONVERT(MONEY,amt.value('(AMOUNT2/text())[1]',           'VARCHAR(MAX)'))      AS AMOUNT2
                ,ROW_NUMBER() OVER (ORDER BY T.amt)                                                 AS ROWID    
        FROM    @XML.nodes('ENTITY/AMOUNT') AS T(amt) 
    )amt
        ON nme.ROWID = amt.ROWID
OPTION (OPTIMIZE FOR (@XML = NULL))

【讨论】:

  • FGGFGFGF67052549.33FGGFGFGF67052549.33
  • 如果这确实是您的 xml 架构,您可以使用编辑后的代码来完成,假设每个金额都有一个名称,并且它们在 xml 中出现的顺序是名称和金额之间的关系跨度>
  • 我已经更新了我的答案以处理实体内部的多个分组
  • 我会检查并通知您
猜你喜欢
  • 1970-01-01
  • 2016-03-28
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多