O link que Kangkan forneceu mostrará como fazer isso se você conhecesse os nomes das colunas com antecedência. Estamos indo para a mesma lógica, exceto usando SQL dinâmico para construir a instrução. Há 2 partes para cada campo que você precisa incluir, o campo na instrução select e uma junção apropriada para obter o valor...
Primeiro declare 3 variáveis para construir isso... Eu irei com @select, @join e @sql para este exemplo. Dê as variáveis os valores iniciais
set @select = 'select user_id,'
set @join = 'from table t'
agora declare e carregue um cursor com os valores distintos no campo table.key. Vou usar @field enquanto a variável é preenchida com o campo distinto table.key. Em seguida, percorra-o construindo as duas variáveis:
set @select = @select + ', ' + @field + '.value as '[email protected]+'
set @join = @join + ' left join table ' + @field + 'on '[email protected]+'.key = t.key and and '[email protected]+'.user_id = t.user_id
(a junção é projetada para usar o valor em @field como o alias da tabela)
faça um loop pelo seu cursor construindo @select e @join. No final do ciclo:
set @sql = @select + @join + 'where clause if you want'
exec @sql
SQL dinâmico construído como este pode ser uma dor absoluta para solucionar problemas (e acertar) e abrir problemas de segurança... mas é a única maneira de ver isso realizado. Observe as restrições de tamanho em suas variáveis... se você tiver muitas chaves distintas lá, as variáveis crescerão muito. Desculpe, eu não posso ser mais exato com o pseudo sobre isso ... você encontrará a construção de sql dinâmico em sql é meticuloso.