【问题标题】:Structuring xml returned by select statement in Sql Server结构化 Sql Server 中 select 语句返回的 xml
【发布时间】:2015-10-22 13:13:31
【问题描述】:

比方说,我有两张桌子

ItemGoods、ServiceGoods,其中包含 Name 和 Price 等列。

代表销售的不同种类的商品。

我想把它选成一个单一的 xml 结构。

现在我正在使用这个选择

DECLARE @goods_prices VARCHAR(8000)
SET @goods_prices = (select * from
                        (SELECT  [name] item_name,
                                 [cost] price   
                              FROM  ItemGoods
                        UNION
                        SELECT  [name] service_name,
                                [cost] price
                              FROM  ServiceGoods)   goods
                    FOR XML AUTO);

我得到的输出:

<goods>
  <itemName>Item1</itemName>
  <price>299.0</price>
</goods>
<goods>
  <itemName>Service1</itemName>
  <price>4,99</price>
</goods>

我寻求的输出会是这样的

<goods>
  <itemGoods>
    <item>
      <itemName>Item1</itemName>
      <price>299.0</price>
    </item>
  </itemGoods>
  <serviceGoods>
    ...
  </serviceGoods>
</goods>

我如何实现这一目标?我需要将结果打包到一个变量中。 只要我可以从服务中定义项目,一个更简单的 xml 结构就可以了

【问题讨论】:

    标签: sql-server select for-xml-path


    【解决方案1】:

    它适用于 FOR XML EXPLICIT (Use EXPLICIT Mode with FOR XML

    declare @ItemGoods table(name varchar(50), cost varchar(50))
    declare @ServiceGoods table(name varchar(50), cost varchar(50))
    
    Insert into @ItemGoods(name, cost) values('Item1', '299'), ('Item2', '333')
    Insert into @ServiceGoods(name, cost) values('Serv1', '555'),('Serv2', '222')
    
    
    
    Select 1 as Tag, NULL as parent
        , NULL as [goods!1!]
        , NULL as [itemGoods!2!]
        , NULL as [item!3!itemName!Element]
        , NULL as [item!3!price!Element]
        , NULL as [serviceGoods!4!]
        , NULL as [item!5!itemName!Element]
        , NULL as [item!5!price!Element]
    Union All
    Select 2 as Tag, 1 as parent
        , NULL
        , NULL, NULL, NULL
        , NULL, NULL, NULL
    Union All
    Select 3 as Tag, 2 as parent
        , NULL
        , NULL, [name], [cost]
        , NULL, NULL, NULL
    FROM  @ItemGoods item
    Union All 
    Select 4 as Tag, 1 as parent
        , NULL
        , NULL, NULL, NULL
        , NULL, NULL, NULL
    Union All
    Select 5 as Tag, 4 as parent
        , NULL
        , NULL, NULL, NULL
        , NULL, [name], [cost]
    FROM  @ServiceGoods item
    For xml explicit
    

    输出:

    <goods>
      <itemGoods>
        <item>
          <itemName>Item1</itemName>
          <price>299</price>
        </item>
        <item>
          <itemName>Item2</itemName>
          <price>333</price>
        </item>
      </itemGoods>
      <serviceGoods>
        <item>
          <itemName>Serv1</itemName>
          <price>555</price>
        </item>
        <item>
          <itemName>Serv2</itemName>
          <price>222</price>
        </item>
      </serviceGoods>
    </goods>
    

    【讨论】:

      【解决方案2】:

      您可以使用它(为了方便起见,我使用变量表,但显然它也适用于真实表):

      DECLARE @ItemGoods TABLE (
        NAME NVarChar(50) NOT NULL,
        COST Decimal(18, 2) NOT NULL
      )
      
      DECLARE @ServiceGoods TABLE (
        NAME NVarChar(50) NOT NULL,
        COST Decimal(18, 2) NOT NULL
      )
      
      INSERT INTO @ItemGoods VALUES('Item1', 299.0)
      INSERT INTO @ServiceGoods VALUES('Service1', 4.99)
      
      SELECT (
        SELECT NAME AS itemName
         , COST AS price
        FROM @ItemGoods
        FOR XML PATH('Item'), TYPE
      ) AS ItemGoods
      , (
        SELECT NAME AS itemName
         , COST AS price
        FROM @ServiceGoods
        FOR XML PATH('Service'), TYPE
      ) AS ServiceGoods
      FOR XML PATH('Goods')
      

      还有输出:

      <Goods>
        <ItemGoods>
          <Item>
            <itemName>Item1</itemName>
            <price>299.00</price>
          </Item>
        </ItemGoods>
        <ServiceGoods>
          <Service>
            <itemName>Service1</itemName>
            <price>4.99</price>
          </Service>
        </ServiceGoods>
      </Goods>
      

      【讨论】:

      • 壮丽的。非常感谢你。我尝试嵌套它,但我错过了外部 select ( ) itemGoods,SQL Server 会抛出错误。
      猜你喜欢
      • 1970-01-01
      • 2016-07-02
      • 2010-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 2015-10-30
      • 1970-01-01
      相关资源
      最近更新 更多