Creo que estás a mitad de camino. Sólo tiene que utilizar UNPIVOT
y dynamic SQL
como Martin recomendados:
CREATE TABLE TableA (
Code VARCHAR(10),
Name VARCHAR(10),
Details VARCHAR(10)
)
INSERT TableA VALUES ('Foo', 'Bar', 'Baz')
GO
DECLARE @sql nvarchar(max)
SET @sql = (SELECT STUFF((SELECT ',' + column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name='TableA'
ORDER BY ordinal_position FOR XML PATH('')), 1, 1, ''))
SET @sql = N'SELECT [Key], Val FROM (SELECT ' + @sql + ' FROM TableA) x '
+ 'UNPIVOT (Val FOR [Key] IN (' + @sql + ')) AS unpiv'
EXEC (@sql)
Resultados:
Key Val
------------ ------------
Code Foo
Name Bar
Details Baz
Hay una advertencia, por supuesto. Todas las columnas deberán ser del mismo tipo de datos para que funcione el código anterior. Si no lo están, obtendrá este error:
Msg 8167, Level 16, State 1, Line 1
The type of column "Col" conflicts with the type of
other columns specified in the UNPIVOT list.
Para evitar esto, deberá crear dos enunciados de cadenas de columnas. Uno para obtener las columnas y otro para convertirlos todos como el tipo de datos para su columna Val.
Para varios tipos de columna:
CREATE TABLE TableA (
Code INT,
Name VARCHAR(10),
Details VARCHAR(10)
)
INSERT TableA VALUES (1, 'Foo', 'Baf')
GO
DECLARE
@sql nvarchar(max),
@cols nvarchar(max),
@conv nvarchar(max)
SET @cols = (SELECT STUFF((SELECT ',' + column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name='TableA'
ORDER BY ordinal_position FOR XML PATH('')), 1, 1, ''))
SET @conv = (SELECT STUFF((SELECT ', CONVERT(VARCHAR(50), '
+ column_name + ') AS ' + column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_name='TableA'
ORDER BY ordinal_position FOR XML PATH('')), 1, 1, ''))
SET @sql = N'SELECT [Key], Val FROM (SELECT ' + @conv + ' FROM TableA) x '
+ 'UNPIVOT (Val FOR [Key] IN (' + @cols + ')) AS unpiv'
EXEC (@sql)
Este es un '' no es un UNPIVOT' PIVOT' pero todavía se necesita un SQL dinámico. –
+1 por el comentario de Martin. Como no sabe que las columnas están sin guiar, necesita SQL dinámico. – MatBailie
@ Aaron - solo un error tipográfico, corregido ahora – kateroh