TSQL将行值转换为一个列表

时间:2013-09-04 08:53:52

标签: sql-server tsql unpivot

源表

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

目的地表

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

我正在使用动态SQL。 有什么帮助吗?

这是我的代码,只需将表格名称和where子句中的Id更改为适合您的

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) 

现在我需要创建一个新表,其中有一列保持将每个值保存为行

感谢@ Mahmoud-Gamal 解决方案应该如下所示

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)

请将“vehicle”表名更改为数据库中包含不同类型(datetime,int和nvarchar)列的任何表,并显示以下错误 有帮助吗? “描述”列的类型与UNPIVOT列表中指定的其他列的类型冲突。

2 个答案:

答案 0 :(得分:4)

使用UNPIVOT表格运算符:

SELECT col AS RowValues
FROM table1 AS t
UNPIVOT
(
  col
  FOR value IN([col1], 
               [col2], 
               [col3],
              [col4],
              [col5])
) AS u;

这会给你:

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

更新

如果您不知道列的名称,并且想要动态执行此操作,则必须使用动态SQL执行此操作。

但问题是如何获取列名?

你可以从information_schema.columns获取列名,然后在一个sql中连接它们,然后用这个字符串替换UNPIVOT中的列名,并像这样动态执行该语句:< / p>

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);

答案 1 :(得分:0)

我相信你想要这个

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

或者可能正在关注

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