Ho bisogno di eseguire un pivot su una colonna XML in una tabella, in cui l'XML contiene più elementi con un numero di attributi. Gli attributi in ogni elemento sono sempre gli stessi, tuttavia il numero di elementi varierà. Le faccio un esempio ...Come ruotare su attributi di una colonna XML in T-SQL
FormEntryId | FormXML | DateCreated
====================================================================================
1 |<Root> | 10/15/2009
| <Form> |
| <FormData FieldName="Username" FieldValue="stevem" /> |
| <FormData FieldName="FirstName" FieldValue="Steve" /> |
| <FormData FieldName="LastName" FieldValue="Mesa" /> |
| </Form> |
|</Root> |
| |
------------------------------------------------------------------------------------
2 |<Root> | 10/16/2009
| <Form> |
| <FormData FieldName="Username" FieldValue="bobs" /> |
| <FormData FieldName="FirstName" FieldValue="Bob" /> |
| <FormData FieldName="LastName" FieldValue="Suggs" /> |
| <FormData FieldName="NewField" FieldValue="test" /> |
| </Form> |
|</Root> |
Ho bisogno di finire con un set di risultati per ogni NomeCampo distinti valori di attributo (In questo esempio, nome utente, Nome, Cognome, e NewField) con i corrispondenti fieldValue attributi come il valore. I risultati per l'esempio che ho dato sopra sarebbe simile:
FormEntryId | Username | FirstName | LastName | NewField | DateCreated
======================================================================
1 | stevem | Steve | Mesa | NULL | 10/15/2009
----------------------------------------------------------------------
2 | bobs | Bob | Suggs | test | 10/16/2009
ho trovato un modo per ottenere questo risultato con le colonne statiche
SELECT
FormEntryId,
FormXML.value('/Root[1]/Form[1]/FormData[@FieldName="Username"][1]/@FieldValue','varchar(max)') AS Username,
FormXML.value('/Root[1]/Form[1]/FormData[@FieldName="FirstName"][1]/@FieldValue','varchar(max)') AS FirstName,
FormXML.value('/Root[1]/Form[1]/FormData[@FieldName="LastName"][1]/@FieldValue','varchar(max)') AS LastName,
FormXML.value('/Root[1]/Form[1]/FormData[@FieldName="NewField"][1]/@FieldValue','varchar(max)') AS NewField,
DateCreated
FROM FormEntry
Comunque mi piacerebbe vedere se c'è un metodo per le colonne devono essere dinamiche in base al set distinto di valori di attributo "NomeCampo".
+1 per la formattazione del codice piuttosto piacevole. –