2010-04-22 4 views
1

Je crée une valeur de colonne séparée par des virgules, spécifiée dans l'attribut dbName du code XML ci-dessous. Maintenant, je veux concaténer ces colonnes sur la base de l'attribut Position.Comment faire Colonne OrderBY on XML dans SQL SERVER 2008

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 

C'est la requête par laquelle je génère un CSV de colonnes. Je dois l'utiliser comme une liste de sélection.

 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' 

Le résultat devrait être

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

S'il vous plaît aider.

Répondre

1

Cela devrait fonctionner:

Notez que vous devez lire l'attribut dbName.

[EDIT] Mise à jour pour inclure l'ordre par. Basicaly vous lisez aussi l'attribut xml de Postion, utilisez alors que dans la 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

comment commander sur la base de la position d'attribut – Rohit

+0

@Rohit J'ai mis à jour ma réponse à trier sur le Postition attribut – edosoft

+0

merci beaucoup.Il résout mon problème. – Rohit

0

Voir this article pour une manière sympa de faire une concaténation de chaîne sans utiliser de curseur.

C'est dans la section "Remplacement du curseur avec une approche basée sur SET".

Questions connexes