【问题标题】:Return XML from stored procedure从存储过程返回 XML
【发布时间】:2017-02-16 09:22:33
【问题描述】:

我必须以以下格式从 SQL Server 存储过程中返回 XML:

<Customer1>
 <Policy1></Policy1>
 <Policy2></Policy2>
</Customer1>
<Customer2>
 <Policy1></Policy1>
 <Policy2></Policy2>
 <Policy3></Policy3>`
<Customer2>
.......

问题是我的查询正在为每一行创建&lt;Customer&gt; 节点。

【问题讨论】:

  • 您好!请向我们展示您到目前为止所做的尝试。

标签: sql-server xml


【解决方案1】:

每当您看到带编号的名称(Policy1、Policy2...Customer1、Customer2)时,您就可以肯定,存在糟糕的设计!

在您的情况下,您似乎想使用列值作为元素名称。那是你真的不应该做的事情

假设有一个带有 ID 和 Name 的客户表和一个带有 ID、CustomerID 和 Number 的策略表,它可能如下所示:

DECLARE @customer TABLE(ID INT,Name VARCHAR(100));
INSERT INTO @customer VALUES(1,'cust 1'),(2,'cust 2'),(3,'cust 3');

DECLARE @policy TABLE(ID INT,CustomerID INT,Number VARCHAR(100));
INSERT INTO @policy VALUES
 (1,1,'p1 for c1'),(2,1,'p2 for c1')
,(3,2,'p1 for c2'),(4,2,'p2 for c2'),(5,2,'p3 for c2')
--no policy for c3

SELECT ID AS [@id]
      ,Name AS [@name]
      ,(
        SELECT ID AS [@id]
              ,Number AS [@number] 
        FROM @policy AS p
        WHERE p.CustomerID=c.ID
        FOR XML PATH('policy'),ROOT('policies'),TYPE
       )
FROM @customer AS c
FOR XML PATH('Customer')

结果

<Customer id="1" name="cust 1">
    <policies>
        <policy id="1" number="p1 for c1" />
        <policy id="2" number="p2 for c1" />
    </policies>
</Customer>
<Customer id="2" name="cust 2">
    <policies>
        <policy id="3" number="p1 for c2" />    
        <policy id="4" number="p2 for c2" />
        <policy id="5" number="p3 for c2" />
    </policies>
</Customer>
<Customer id="3" name="cust 3" />

提示

你可以让,ROOT('policies')离开(不推荐)

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2013-06-21
    相关资源
    最近更新 更多