Convertir chaque colonne d'un logging en logging séparé

J'ai un disque:

DECLARE @Tbl AS TABLE(Col1 VARCHAR(10), Col2 VARCHAR(10), Col3 VARCHAR(10)); INSERT INTO @Tbl VALUES('Val1', 'Val2', 'Val3') -- Source Record SELECT Col1, Col2, Col3 FROM @Tbl 

Résultat: Val1 Val2 Val3

Je veux le résultat de chaque colonne en tant que deux loggings séparés de colonne comme la première colonne deviendra le titre de la colonne source et la deuxième colonne devrait être la valeur de la colonne source comme le résultat de la requête ci-dessous dans laquelle j'ai obtenu le résultat

 --Query for Target Result SELECT 'Col1' AtsortingbuteTitle, CONVERT(VARCHAR, Col1) AtsortingbuteValue FROM @Tbl UNION ALL SELECT 'Col2' AtsortingbuteTitle, CONVERT(VARCHAR, Col2) AtsortingbuteValue FROM @Tbl UNION ALL SELECT 'Col3' AtsortingbuteTitle, CONVERT(VARCHAR, Col3) AtsortingbuteValue FROM @Tbl 

Le problème dans cette requête est que je dois explicitement définir les colonnes, est-il possible d'get dynamicment les noms des colonnes et leurs valeurs?

Vous pouvez utiliser UNPIVOT mais vous devez toujours connaître les noms des colonnes.

 SELECT ColumnName, ValueName FROM (SELECT * FROM @Tbl) AS Data UNPIVOT ( ValueName FOR ColumnName IN (Col1, Col2, Col3) ) AS PivottedOutput 

J'aime la méthode apply pour le non-pivotement dans SQL Server:

 select v.* from @tbl t cross apply (values ('col1', col1), ('col2', col2), ('col3', col3) ) v(AtsortingbuteTitle, AtsortingbuteValue); 

Cela simplifie la requête mais ne répond pas directement à la question.

Si vous voulez un nombre variable de colonnes, alors vous devrez utiliser SQL dynamic. C'est un peu lourd sur une vraie table. Toutefois, avec une variable de table ou une table temporaire, vous avez le problème supplémentaire de règles de scope – le nom de la table ne sera pas dans la scope lorsque vous exécutez l'instruction.