Masz więc kilka problemów... po pierwsze, wymaga to dynamicznego sql, ponieważ tabela i kolumny nie są znane z wyprzedzeniem, więc nie możesz po prostu użyć prostego unpivot.
Oznacza to również, że będziesz musiał pobrać nazwy kolumn z tabel systemowych.
Drugim problemem jest to, że wszystkie twoje typy danych są nieznane, więc musisz rzutować wszystkie kolumny na coś, co może obsłużyć wszystko i dowolną długość... varchar(max).
Mając na uwadze te dwie przeszkody, oto rozwiązanie:
declare @yourTable varchar(50)
declare @yourKeyField varchar(50)
declare @yourKey varchar(50)
set @yourTable = 'MyTable' /** change to tablename or pass as parameter */
set @yourKeyField = 'ID' /** change to fieldname or pass as parameter */
set @yourKey = '5' /** change to key value or pass as parameter */
declare @query nvarchar(max)
select @query = COALESCE(@query+' union all ','') + 'select ''' + c.name + ''' as
[Column], Cast([' + c.name + '] AS VarChar(MAX)) as [Value] from ' + @yourTable + '
where ' + @yourKeyField + ' = ''' + @yourKey + '''' from syscolumns c
inner join sysobjects o on c.id = o.id and o.xtype = 'u'
where o.name = @yourTable order by c.colid
exec sp_executesql @query /** execute query */
Wreszcie, nie mogę z czystym sumieniem polecić rozwiązania, które używa dynamicznego sql bez ostrzeżenia o niebezpieczeństwach z nim związanych (zarówno z punktu widzenia wydajności, jak i możliwości wstrzyknięcia). Przeczytaj ten doskonały artykuł, jeśli chcesz poszerzyć swoją wiedzę na ten temat.
http://www.sommarskog.se/dynamic_sql.html