读取xml文件并将值放入MERGE的sql表中

时间:2015-03-18 13:50:17

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

我有一个看起来像这样的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中包含所有这些字段并将它们放入表中,这应该适用于所有类似的文件。不仅仅是这些价值观。

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

我还没弄明白如何编写这个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 

1 个答案:

答案 0 :(得分: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