Puis-je créer une requête de pivot dynamic à partir de la table de valeurs de key avec différents types de données?

J'ai une table de paires key-valeur. J'ai créé un script en utilisant SQL dynamic qui pivote la table correctement. Cependant, les keys ont différents types de données. Y at-il un moyen de lancer les keys pendant ou après le pivot dynamicment? Je peux avoir les types de données dans le même tableau de paires key-valeur pour chaque key ou dans une table distincte lisible par la key.

SQL dynamic est utilisé car je ne connais pas toujours les colonnes. Il y aura toujours un type de données.

Un exemple de la table de départ:

sampleid key value datatype ------------------------------------ 1001 Name Andrew varchar(50) 1001 Date 20150129 datetime 1002 Name Anna varchar(50) 1002 Date 20150129 datetime 

Le résultat final serait ceci avec le nom comme nvarchar et la date comme datetime: Le manuscrit est une procédure stockée qui crée ceci dans une vue. La vue est accessible via des applications externes telles que SAS et Olive qui récupèrent le type de données de la vue. Bien sûr, ce n'est pas idéal, mais c'est ce que j'ai été chargé d'essayer!

 sampleid name date ----------------------------- 1001 Andrew 20150129 1002 Anna 20150129 

Vous pouvez le faire en utilisant le SQL dynamic, vous aurez juste à créer deux lists séparées de "nouvelles colonnes" comme une string. Une list inclura les noms de colonnes en cours de conversion vers votre type de données, la seconde sera utilisée pour la fonction PIVOT.

Le code serait:

 DECLARE @cols AS NVARCHAR(MAX), @colsConversion AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) -- get the list of [key] items for the columns used in the PIVOT select @cols = STUFF((SELECT ', ' + QUOTENAME([key]) from yourtable group by [key], datatype FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') -- get the list of columns for the final select -- include a conversion of the columns into the correct datatype select @colsConversion = STUFF((SELECT ', cast(' + QUOTENAME([key]) +' as '+ datatype+') as ' + QUOTENAME([key]) from yourtable group by [key], datatype FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') -- the converted columns go in the final select list -- while the other @cols are used inside the PIVOT set @query = 'SELECT sampleid, ' + @colsConversion + ' from ( select sampleid, [key], value from yourtable ) x pivot ( max(value) for [key] in (' + @cols + ') ) p; ' exec sp_executesql @query; 

Voir SQL Fiddle avec démo