【问题标题】:Service Broker -- how to extract the rows from the XML message?Service Broker -- 如何从 XML 消息中提取行?
【发布时间】:2012-07-19 14:50:13
【问题描述】:

假设我有以下情况(用于演示)。简单表内容被转换为 XML 值并通过 Service Broker 发送到另一个 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 中提取行的最佳方法是什么,以及如何将它们放到目标表中?

谢谢,彼得

【问题讨论】:

    标签: sql-server service-broker


    【解决方案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 Data Type Methods

    【讨论】:

    【解决方案2】:

    还有其他选项(不过我更喜欢 Remus 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
    

    【讨论】:

      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      相关资源
      最近更新 更多