mysql - 读取xml文件并通过MERGE将值放入sql表中

标签 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>

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

我想将这些值放入具有相同列的 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/

相关文章:

ios - 使用 Swift 和 KissXML 创建 XML : example?

xml - Linux 上汉字的 XML UTF-8/ISO-8859-1 编码问题

php - 注册表单无法将数据写入数据库

SQL Server - 查找范围内的值

java - Java 中的 XML 格式化 - 维护状态缩进

java - 优化数据库搜索查询

sql - SQL Server 中的自然连接

mysql - 显示数据库/表 INTO OUTFILE

mysql - 我怎样才能在我的elasticsearch查询中使用MySQL sum() 和 group by 子句?

mysql - redis 作为 mysql 的回写 View 计数缓存