2013-07-16 32 views
1

我有以下SQL,如何将单行结果放入xml的单个元素中?

SELECT AT.ID ATT_ID 
     ,VAL.ID VAL_ID 
     ,COALESCE(ATT.Name,AT.Name) AS Name 
     ,COALESCE(VALT.Value,VAL.Value) AS Value 
     ,COALESCE(GT.Name,G.Name) AS GroupName 
     ,AT.KeyAttribute 
     ,AT.[Order] 
FROM Attributes AT 
    LEFT OUTER JOIN AttributesTranslations ATT on (AT.ID = ATT.AttributeID AND ATT.LanguageID = @LanguageID) 
    LEFT OUTER JOIN AttributesValues VAL ON VAL.AttributeID = AT.ID AND VAL.ProductID = @ProductID 
    LEFT OUTER JOIN AttributesValuesTranslations VALT on (VAL.ID = VALT.AttributeValueID AND VALT.LanguageID = @LanguageID) 
    LEFT OUTER JOIN AttributesGroups G ON G.ID = AT.GroupID 
    LEFT OUTER JOIN AttributesGroupsTranslations GT on (G.ID = GT.AttributeGroupID AND GT.LanguageID = @LanguageID) 
WHERE AT.ProductTypeID = (SELECT ProductTypeID FROM Products WHERE ID = @ProductID) 
    AND ((AT.RetailerID = @RetailerID) OR (@RetailerID = -1)) 
ORDER BY G.[order],G.Name ,AT.[Order] 
FOR XML AUTO, ELEMENTS 

它会返回,

<AT> 
    <ATT_ID>2</ATT_ID> 
    <KeyAttribute>0</KeyAttribute> 
    <Order>2</Order> 
    <VAL> 
    <VAL_ID>32614</VAL_ID> 
    <Name>Design</Name> 
    <Value>asfdsa</Value> 
    <GroupName>zOther</GroupName> 
    </VAL> 
</AT> 
<AT> 
    <ATT_ID>2</ATT_ID> 
    <KeyAttribute>0</KeyAttribute> 
    <Order>2</Order> 
    <VAL> 
    <VAL_ID>32614</VAL_ID> 
    <Name>Design</Name> 
    <Value>asfdsa</Value> 
    <GroupName>zOther</GroupName> 
    </VAL> 
</AT> 

我想要的结果是,

<AT> 
    <ATT_ID>2</ATT_ID> 
    <KeyAttribute>0</KeyAttribute> 
    <Order>2</Order> 
    <VAL_ID>32614</VAL_ID> 
    <Name>Design</Name> 
    <Value>asfdsa</Value> 
    <GroupName>zOther</GroupName> 
</AT> 
<AT> 
    <ATT_ID>2</ATT_ID> 
    <KeyAttribute>0</KeyAttribute> 
    <Order>2</Order> 

    <VAL_ID>32614</VAL_ID> 
    <Name>Design</Name> 
    <Value>asfdsa</Value> 
    <GroupName>zOther</GroupName> 

</AT> 

回答

3

不知道是否会工作,因为我不没有你的表格结构来测试,但它给我简化的演示结果。尝试在它包装的CTE(或子查询)查询并使用SELECT ... FOR XML

WITH AT AS 
(
    SELECT AT.ID ATT_ID 
     ,VAL.ID VAL_ID 
     ,COALESCE(ATT.Name,AT.Name) AS Name 
     ,COALESCE(VALT.Value,VAL.Value) AS Value 
     ,COALESCE(GT.Name,G.Name) AS GroupName 
     ,AT.KeyAttribute 
     ,AT.[Order] 
     ,G.Order as G_Order --added for ordering 
     ,G.Name as G_Name --added for ordering 
    FROM Attributes AT 
     LEFT OUTER JOIN AttributesTranslations ATT on (AT.ID = ATT.AttributeID AND ATT.LanguageID = @LanguageID) 
     LEFT OUTER JOIN AttributesValues VAL ON VAL.AttributeID = AT.ID AND VAL.ProductID = @ProductID 
     LEFT OUTER JOIN AttributesValuesTranslations VALT on (VAL.ID = VALT.AttributeValueID AND VALT.LanguageID = @LanguageID) 
     LEFT OUTER JOIN AttributesGroups G ON G.ID = AT.GroupID 
     LEFT OUTER JOIN AttributesGroupsTranslations GT on (G.ID = GT.AttributeGroupID AND GT.LanguageID = @LanguageID) 
    WHERE AT.ProductTypeID = (SELECT ProductTypeID FROM Products WHERE ID = @ProductID) 
     AND ((AT.RetailerID = @RetailerID) OR (@RetailerID = -1)) 
) 
SELECT 
    ATT_ID , 
    KeyAttribute, 
    [Order], 
    VAL_ID , 
    Name , 
    Value , 
    GroupName 
FROM AT 
ORDER BY G_Order,G_Name,[Order] 
FOR XML AUTO, ELEMENTS 

Simplified DEMO

+0

你快一分钟;这应该是一个正确的答案 – OzrenTkalcecKrznaric

2

这里有一个简单(变丑)版本:在选择包装的一切,做的XML即:

SELECT * FROM (
    ...your-select-here... 
) temp 
FOR XML AUTO, ELEMENTS 
相关问题