【问题标题】:Read xml file and put values into sql table by MERGE读取 xml 文件并通过 MERGE 将值放入 sql 表中
【发布时间】:2015-05-21 08:17:12
【问题描述】:

我得到一个如下所示的 XML 文件:

<ns0:Currency xmlns:ns0="http://bla.bla.Currency">
                <Currency>
                    <IntComp>08</IntComp>
                    <Active>1</Active>
                    <Currency>USD</Currency>
                    <Text>US Dollar</Text>
                </Currency>
            </ns0:Currency>

编辑:我需要将货币中的所有这些字段放入表格中,这应该适用于所有看起来像这样的文件。不仅是这些值。

我想将这些值放入具有相同列的我的 sql 表中,我想将这些值合并到表中,以便在 IntComp 值 && 货币匹配与另一个文件匹配时更新。如果文件不匹配,它将插入。

我还没有弄清楚如何编写这个 sql 查询。

编辑: 表格如下所示。

dbo.Integration
ID | XMLData | Entity | EntityId | Action | ....

XMLData 是我想要发送到另一个表并从该字段中挑选出那些节点的带有 XMLData 的字符串。

另一张桌子:

dbo.Currency
ID | IntComp | Active | Currency | Text

这是我迄今为止一直在尝试的:

SELECT XMLData.value('(/ns0:Currency xmlns:ns0="http://bla.bla.Currency/Currency/IntComp/node())[1]', 'int') as intComp,
       XMLData.value('(/ns0:Currency xmlns:ns0="http://bla.bla.Currency/Currency/Active/node())[1]', 'int') as Active,
       XMLData.value('(/ns0:Currency xmlns:ns0="http://bla.bla.Currency"/Currency/Currency/node())[1]', 'varchar(10)') as Currency,
       XMLData.value('(/ns0:Currency xmlns:ns0="http://bla.bla.Currency"/Currency/text/node())[1]', 'varchar(MAX)') as Active
FROM dbo.Integration 

【问题讨论】:

    标签: mysql sql-server xml merge insert-update


    【解决方案1】:

    也许你可以试试这样的..

    DECLARE @DocHandle AS INT;
    DECLARE @XmlDocument AS NVARCHAR(1000);
    SET @XmlDocument = '<ns0:Currency xmlns:ns0="http://bla.bla.Currency"><Currency><IntComp>08</IntComp><Active>1</Active><Currency>USD</Currency><Text>US Dollar</Text></Currency></ns0:Currency>';
    EXEC sys.sp_xml_preparedocument @DocHandle OUTPUT, @XmlDocument,'<ns0:Currency xmlns:ns0="http://bla.bla.Currency"/>';
    
    MERGE INTO tmp1 AS TGT
    USING (SELECT IntComp,Active,Currency,Text FROM OPENXML (@DocHandle, '/ns0:Currency/Currency',11) WITH (IntComp INT,Active INT,Currency varchar(10),Text nvarchar(100))) 
    AS SRC ON SRC.IntComp = TGT.IntComp and SRC.Currency = TGT.Currency 
    WHEN MATCHED THEN UPDATE
    SET TGT.IntComp = SRC.IntComp , TGT.Currency = SRC.Currency 
    WHEN NOT MATCHED THEN INSERT
    VALUES(SRC.IntComp,SRC.Active, SRC.Currency, SRC.Text);
    
    select * from tmp1
    

    【讨论】:

    • 我需要添加很多看起来像这样但具有不同值的 xml 文件。所以需要它一般适用于这种类型的 xml 文件。
    • 您可以创建一个存储过程,该过程将输入作为 xml,您可以在必须插入的任何表上进行合并。
    • 目前我正在从另一个表中选择 xml 字符串,我需要整理这些值,以便它们适合新表。
    • 现在您可以发表评论了。 :) 享受。 (您可能应该删除其他答案)
    • @paqogomez .. 谢谢,我删除了另一个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多