După câte înţeleg, ceea ce ai nevoie este un UNPIVOT dinamic.
Presupunem că avem următoarea tabelă:
CREATE TABLE X1 (
t1 int,
t2 int,
t3 int
)
INSERT INTO X1 VALUES (2,7,12)
INSERT INTO X1 VALUES (5,8,19)
INSERT INTO X1 VALUES (7,5,21)
Dacă am şti dinainte numele coloanelor, am putea rezolva problema cu un query de genul următor:
SELECT 't1' as name, MAX([t1]) AS value FROM [x1]
UNION ALL
SELECT 't2' as name, MAX([t2]) AS value FROM [x1]
UNION ALL
SELECT 't3' as name, MAX([t3]) AS value FROM [x1]
Însă neştiind numele coloanelor, trebuie să generăm acest query într-un mod dinamic (având grijă să evităm SQL Injection), folosind interogări pentru aggregate concatenation pe catalog views:
DECLARE @TableName sysname, @SQL nvarchar(max)
SET @TableName='X1'
SET @SQL=STUFF((
SELECT ' UNION ALL SELECT '+QUOTENAME(name,'''')
+' as name, MAX('+QUOTENAME(name)
+') AS value FROM '+QUOTENAME(@TableName)
FROM sys.columns WHERE object_id=OBJECT_ID(@TableName) FOR XML PATH('')
),1,11,'')
PRINT @SQL
EXEC(@SQL)
Răzvan