在Sql Server中构造由select语句返回的xml

时间:2015-10-22 13:13:31

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

让我们说,我有两张桌子

ItemGoods,ServiceGoods,其他列中包含名称和价格。

代表销售的各种商品。

我想将它选择为单个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结构

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

你可以使用它(我使用变量表是为了方便,但它也适用于真正的表):

string SelectedArticle

输出:

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')