Sql server 如何在SQLServer2008中对XML列执行OrderBY

Sql server 如何在SQLServer2008中对XML列执行OrderBY,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在为下面XML的dbName属性中指定的列创建一个逗号分隔的值。现在我想根据Position属性连接这些列 DECLARE @varXML AS XML = '<gridFormat> <column property="FacilityInternalID" dbName="Pname" HeaderText="TAT Health" IsVisible="1" Position="1

我正在为下面XML的dbName属性中指定的列创建一个逗号分隔的值。现在我想根据Position属性连接这些列

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
结果应该是

select Pname,Priority,JobID,name,sname,status FROM JobListingDetails.
请提供帮助。

有关不使用光标进行字符串连接的酷方法,请参阅

它位于“使用基于集合的方法替换光标”部分下。

有关不使用光标进行字符串连接的酷方法,请参阅

它位于“用基于集合的进近替换光标”部分下。

这应该可以:

注意,您需要读取dbName属性

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
[编辑]已更新以包括订购人。基本上,您还可以从xml中读取position属性,然后按照以下顺序使用该属性:

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' 
这应该起作用:

注意,您需要读取dbName属性

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
[编辑]已更新以包括订购人。基本上,您还可以从xml中读取position属性,然后按照以下顺序使用该属性:

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' 

如何根据位置进行订购attribute@Rohit我已经更新了我的答案,以便根据职位属性排序。如何根据职位属性排序attribute@Rohit我已经更新了我的答案,以便根据position属性进行排序