服务代理 - 如何提取XML消息的行?(Service Broker — how to extrac

2019-06-26 10:18发布

说我有以下情况(演示)。 简单的表的内容被转换成XML值,并通过服务代理发送到另一个服务器的SQL其中的结果SELECT是将要存储在非XML形式(即通常的,简单的数据库表)。 我们试试吧:

CREATE TABLE tab (a int, b int, c int);
GO

INSERT INTO tab (a, b, c) VALUES (1, 11, 111);
INSERT INTO tab (a, b, c) VALUES (2, 22, 222);
INSERT INTO tab (a, b, c) VALUES (3, 33, 333);
INSERT INTO tab (a, b, c) VALUES (4, 44, 444);
GO

SELECT * FROM tab FOR XML RAW, TYPE;
GO

当捕捉价值的消息,它看起来像:

<row a="1" b="11" c="111" />
<row a="2" b="22" c="222" />
<row a="3" b="33" c="333" />
<row a="4" b="44" c="444" />

即单多串。 再说了,我创建在目标机完全一样的表结构:

CREATE TABLE tab_destination (a int, b int, c int);

什么是提取从行的最好方式@msg ,以及如何将它们投入到目标表?

谢谢,切赫

Answer 1:

CREATE TABLE tab (a int, b int, c int); 
GO 

INSERT INTO tab (a, b, c) VALUES (1, 11, 111); 
INSERT INTO tab (a, b, c) VALUES (2, 22, 222); 
INSERT INTO tab (a, b, c) VALUES (3, 33, 333); 
INSERT INTO tab (a, b, c) VALUES (4, 44, 444); 
GO 

CREATE TABLE tab_destination (a int, b int, c int); 
go

declare @x xml = (SELECT * FROM tab FOR XML RAW, TYPE); 

insert into tab_destination (a, b, c)
select 
    x.value('@a', 'int'),
    x.value('@c', 'int'),
    x.value('@b', 'int')
    from @x.nodes('//row') t(x);
GO 

select * from tab_destination;
go

时间阅读XML数据类型方法



Answer 2:

和其他选项(我宁愿莱姆斯Rusanu例子,但..如果大量列和表结构都是一样的,这有助于偷懒):

declare @x xml = (SELECT * FROM tab FOR XML RAW, root('tab'), TYPE); 

Declare @docHandle int  
EXEC sp_xml_preparedocument @docHandle OUTPUT, @x

Select *
FROM OPENXML(@docHandle, 'tab//', 1) 
With dbo.Tab

EXEC sp_xml_removedocument @docHandle


文章来源: Service Broker — how to extract the rows from the XML message?