Necesito realizar un pivote en una columna XML en una tabla, donde el XML contiene múltiples elementos con una serie de atributos. Los atributos en cada elemento son siempre los mismos, sin embargo, la cantidad de elementos variará. Déjeme darle un ejemplo ...Cómo pivotar sobre los atributos de una columna XML en 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> |
tengo que terminar con un conjunto de resultados para cada NombreCampo distintos valores de atributos (En este ejemplo, nombre de usuario, Nombre, Apellido, y NewField) con sus correspondientes atributos como ValorDelCampo el valor. Los resultados para el ejemplo que di anteriormente se vería así:
FormEntryId | Username | FirstName | LastName | NewField | DateCreated
======================================================================
1 | stevem | Steve | Mesa | NULL | 10/15/2009
----------------------------------------------------------------------
2 | bobs | Bob | Suggs | test | 10/16/2009
que he descubierto una manera de lograr esto con columnas estáticas
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
Sin embargo, me gustaría ver si hay un método para tener las columnas dinámicas basadas en el conjunto distinto de valores de atributo "FieldName".
+1 para obtener un bonito formato de código. –