2014-02-07 28 views
0

我从下面的SQL代码出现两个问题:如何将XML编码标签附加到XML结果集

DECLARE @tbl TABLE(BookID int primary key, 
        Title varchar(50), 
        Author varchar(50), 
        Pages int); 

INSERT INTO @tbl SELECT 1,'The Book', 'The Author', 20 
INSERT INTO @tbl SELECT 2,'Another Book', 'Another Author', 20 
INSERT INTO @tbl SELECT 3,'Book', 'Author', 20 

SELECT Book.Title, 
     (SELECT Details.BookID Ref, Details.Author, Details.Pages 
     FROM @tbl Details 
     FOR XML RAW ('Details'), type) 
FROM @tbl Book 
FOR XML RAW ('Book'), ROOT ('Books') 

返回的结果集为:

<Books> 
    <Book Title="The Book"> 
    <Details Ref="1" Author="The Author" Pages="20" /> 
    <Details Ref="2" Author="Another Author" Pages="20" /> 
    <Details Ref="3" Author="Author" Pages="20" /> 
    </Book> 
    <Book Title="Another Book"> 
    <Details Ref="1" Author="The Author" Pages="20" /> 
    <Details Ref="2" Author="Another Author" Pages="20" /> 
    <Details Ref="3" Author="Author" Pages="20" /> 
    </Book> 
    <Book Title="Book"> 
    <Details Ref="1" Author="The Author" Pages="20" /> 
    <Details Ref="2" Author="Another Author" Pages="20" /> 
    <Details Ref="3" Author="Author" Pages="20" /> 
    </Book> 
</Books> 

问题一:详细标签对于每本书都重复多次,我只需要一个。 第2期:我想将<?xml version="1.0"?>附加到结果集的顶部。

回答

0

可能有多种方法可以做到这一点。这里是一个:

DECLARE @tbl TABLE(BookID int primary key, 
       Title varchar(50), 
       Author varchar(50), 
       Pages int); 

INSERT INTO @tbl SELECT 1,'The Book', 'The Author', 20 
INSERT INTO @tbl SELECT 2,'Another Book', 'Another Author', 20 
INSERT INTO @tbl SELECT 3,'Book', 'Author', 20 


;WITH cte (XMLRESULT) AS (

SELECT Book.Title, 
    (SELECT Details.BookID Ref, Details.Author, Details.Pages 
    FROM @tbl Details 
    FOR XML RAW ('Details'), type) 
FROM @tbl Book 
FOR XML RAW ('Book'), ROOT ('Books') 

) 

SELECT '<?xml version="1.0"?>' + XMLRESULT FROM cte 
+0

谢谢你的回答。输出已经从单独的行上很好格式化的XML标记改变为纯文本,是否有保存格式的方法? – Mxaza

+0

不确定。 SSMS对我来说总是一条线,甚至是你原来的帖子。 – smoore4

0

第一个问题是很容易被添加WHERE条款列入子查询处理:

SELECT Book.Title, 
     (SELECT Details.BookID Ref, Details.Author, Details.Pages 
     FROM @tbl Details 
     WHERE Details.BookID = Book.BookID --<-- Here 
     FOR XML RAW ('Details'), type) 
FROM @tbl Book 
FOR XML RAW ('Book'), ROOT ('Books') 

回复:XML声明,我不知道这是那么容易实现的 - 大多数人似乎将解决这个问题转换为文本,只是干扰正面的字符串。

+0

谢谢你,完全滑倒了我的想法(WHERE部分)。第二个问题SQLDBa的回应解决了 – Mxaza