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