我得到了一个如下所示的 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
最佳答案
也许你可以尝试这样的事情..
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
关于mysql - 读取xml文件并通过MERGE将值放入sql表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29123887/