2010-04-22 74 views
1

我在下面的XML的dbName属性中创建了一个逗号分隔的值列。现在我想根据Position属性连接这些列。如何在SQL SERVER 2008中对XML列执行OrderBY

DECLARE @varXML AS XML = 
     '<gridFormat>     
       <column property="FacilityInternalID" dbName="Pname" HeaderText="TAT Health" IsVisible="1" Position="1" /> 
       <column property="FacilityInternalID" dbName="Priority" HeaderText="Priority" IsVisible="1" Position="2" /> 
       <column property="FacilityInternalID" dbName="JobID" HeaderText="Job Number" IsVisible="1" Position="3" /> 
       <column property="FacilityInternalID" dbName="Status" HeaderText="Status" IsVisible="1" Position="6" /> 
       <column property="FacilityInternalID" dbName="name" HeaderText="Customer" IsVisible="1" Position="4" /> 
       <column property="FacilityInternalID" dbName="sname" HeaderText="Facility " IsVisible="1" Position="5" />     
     </gridFormat>' 
     PRINT @varXML 

这是我生成CSV列的查询。我必须将其用作选择列表。

 SELECT @ColumnsToDisplay = LEFT(MyCsvList, LEN(MyCsvList) - 1) 
     FROM (SELECT (SELECT row.value('@property', 
                'varchar(200)') + ', ' AS [text()] 
           FROM  @varXML.nodes('gridFormat/column') 
             AS d (row) 
          FOR 
           XML PATH('') 
          ) AS MyCsvList 
       ) AS MyCsvListFinal 
     SET @SQL = 'SELECT ' + @ColumnsToDisplay 
      + ' FROM JobListingDetails' 

结果应该是

select Pname,Priority,JobID,name,sname,status FROM JobListingDetails. 

请帮助。

回答

1

这应该工作:

请注意,您需要读取dbName属性。

[编辑]更新以包括命令。 Basicaly你也看到从XML的当前位置属性,然后使用在ORDER BY:

declare @ColumnsToDisplay varchar(max) 

DECLARE @varXML AS XML 
set @varxml = 
     '<gridFormat>     
       <column property="FacilityInternalID" dbName="Pname" HeaderText="TAT Health" IsVisible="1" Position="1" /> 
       <column property="FacilityInternalID" dbName="Priority" HeaderText="Priority" IsVisible="1" Position="2" /> 
       <column property="FacilityInternalID" dbName="JobID" HeaderText="Job Number" IsVisible="1" Position="3" /> 
       <column property="FacilityInternalID" dbName="Status" HeaderText="Status" IsVisible="1" Position="6" /> 
       <column property="FacilityInternalID" dbName="name" HeaderText="Customer" IsVisible="1" Position="4" /> 
       <column property="FacilityInternalID" dbName="sname" HeaderText="Facility " IsVisible="1" Position="5" />     
     </gridFormat>' 

SELECT @ColumnsToDisplay = COALESCE(@ColumnsToDisplay + ',', '') + dbName 
FROM 
(
    SELECT row.value('@dbName','varchar(200)') AS dbName, row.value('@Position','int') as pos 
    FROM  @varXML.nodes('gridFormat/column') 
    AS d (row) 
) csv 
order by pos 
select 'SELECT ' + @ColumnsToDisplay + ' FROM JobListingDetails' 
+0

如何订购它的位置的基本属性 – Rohit 2010-04-22 11:24:30

+0

@Rohit我已经更新了我的答案排序的Postition属性 – edosoft 2010-04-22 11:57:01

+0

非常感谢,它解决了我的问题。 – Rohit 2010-04-22 12:02:20

0

请参阅this article了解如何在不使用游标的情况下进行字符串连接。

它位于“用基于SET的方法取代游标”部分。