TSQL transforme les valeurs de ligne en une table de colonnes

Table source

Col1 |Col2 |Col3 |Col4 | Col5 ---------------------------------- hi | this | is | a | test 

Table de destination

 RowValues| ---------- hi this is a test 

J'utilise Dynamic SQL. De l'aide ?

Ceci est mon code, il suffit de changer le nom de la table et l'ID dans la clause where à ce qui vous convient

 DECLARE @sql nVARCHAR(max), @TableName nvarchar(100), @where nvarchar(max) set @TableName = 'stockItems' set @where= ' where id = 2' select @sql ='Select ' select @sql = @sql+ + ' '''+ [name] +' = ''+ cast(' + [name] + ' as nvarchar(10)) as '+[name]+', ' from sys.columns where object_name (object_id) = @TableName set @sql = stuff(@sql, len(@sql), 1, '') + ' From '+@TableName+ @where print @sql set @sql = REPLACE(@sql,', From',' From') set @sql = @sql + ' ' print @sql exec(@sql) 

Maintenant, j'ai besoin de créer une nouvelle table qui a une colonne qui détient détient chaque valeur en tant que ligne

Merci à @ Mahmoud-Gamal La solution devrait être quelque chose comme ci-dessous

 declare @cols nvarchar(max) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(column_name) FROM information_schema.columns WHERE table_name = 'vehicles' FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') , 1, 1, ''); declare @statement nvarchar(max) set @statement =' SELECT ColumnName, Value FROM Vehicles UNPIVOT ( Value FOR ColumnName IN ( '+@cols+' ) ) AS A' execute(@statement) 

S'il vous plaît changer le nom de la table "véhicule" à n'importe quelle table de votre database qui a des colonnes de différents types (datetime, int et nvarchar) et l'erreur ci-dessous est affichée Toute aide? Le type de colonne "Description" est en conflit avec le type des autres colonnes spécifiées dans la list UNPIVOT.

Utilisez l'opérateur de table UNPIVOT :

 SELECT col AS RowValues FROM table1 AS t UNPIVOT ( col FOR value IN([col1], [col2], [col3], [col4], [col5]) ) AS u; 
  • Démo de Fiddle SQL

Cela vous donnera:

 | ROWVALUES | |-----------| | hi | | this | | is | | a | | test | 

Mettre à jour:

Dans le cas où vous ne connaissez pas les noms des colonnes, et que vous voulez le faire dynamicment, vous devez le faire en utilisant SQL dynamic.

Mais le problème est de savoir comment get les noms des colonnes?

Vous pouvez get les noms des colonnes à partir du UNPIVOT information_schema.columns , puis les concaténer dans un sql, puis replace les noms des colonnes dans l' UNPIVOT par cette string, et exécuter cette instruction dynamicment comme ceci:

 DECLARE @cols AS NVARCHAR(MAX); DECLARE @query AS NVARCHAR(MAX); select @cols = STUFF((SELECT distinct ',' + QUOTENAME(column_name) FROM information_schema.columns WHERE table_name = 'Table1' FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') , 1, 1, ''); SELECT @query = ' SELECT col AS RowValues FROM table1 AS t UNPIVOT ( val FOR col IN ( ' + @cols + ' ) ) AS u;'; EXECUTE(@query); 
  • Mise à jour de la démo de Fiddle SQL

Je crois que tu veux ça

 Select Col1 + Col2 + Col3 + Col4 + Col5 From Table 

Ou peut être après

 Select Col1 From Table1 union Select Col2 From Table1 union Select Col3 From Table1 union Select Col4 From Table1 union Select Col5 From Table1 ;