2010-04-22 73 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的方法取代遊標」部分。