Myślę, że jesteś w połowie drogi. Wystarczy użyć UNPIVOT
i dynamic SQL
jak Martin poleca:
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)
Wyniki:
Key Val
------------ ------------
Code Foo
Name Bar
Details Baz
Jest zastrzeżenie, oczywiście. Wszystkie powyższe kolumny będą musiały być takie same, aby powyższy kod zadziałał. Jeśli tak nie jest, pojawi się następujący błąd:
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.
Aby to obejść, należy utworzyć dwie instrukcje kolumnowe. Jeden, aby uzyskać kolumny i jeden, aby rzucić je wszystkie jako typ danych dla twojej kolumny Val.
przypadku wielu typów kolumn:
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)
To 'UNPIVOT' nie' PIVOT' ale trzeba jeszcze dynamicznego SQL. –
+1 za komentarz Martina. Ponieważ nie wiesz, że kolumny są niepijane, potrzebujesz dynamicznego SQL. – MatBailie
@Aaron - tylko literówka, naprawiona teraz – kateroh