Så du har ett par problem... det första är att detta kräver dynamisk sql eftersom tabellen och kolumnerna inte är kända i förväg så du kan inte bara använda en enkel unpivot.
Det betyder också att du måste hämta kolumnnamnen från systemtabeller.
Ditt andra problem är att alla dina datatyper är okända så du måste gjuta alla kolumner till något som kan stödja allt och vilken längd som helst... varchar(max).
Så med dessa två hinder i åtanke är här en lösning:
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 */
Slutligen kan jag inte med gott samvete rekommendera en lösning som använder dynamisk sql utan att varna för farorna med en sådan (både ur prestandasynpunkt och potential för injektion). Läs denna utmärkta artikel om du vill öka dina kunskaper i ämnet.
http://www.sommarskog.se/dynamic_sql.html