读取 xml 文件并通过 MERGE 将值放入 sql table

Read xml file and put values into sql table by MERGE

我得到一个 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>

编辑:我需要将所有这些字段放入 Currency 中并将它们放入 table,这应该适用于所有看起来像这样的文件。不仅是这些值。

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

我还没有想出如何编写这个 sql 查询。

编辑: table 看起来像这样。

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

XML数据是包含 XML数据的字符串,我想将其发送到另一个 table 并从该字段中挑选出那些节点。

另一个table:

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 

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

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