1

源表

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)

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

4

2 回答 2

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,并像这样动态执行该语句:

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);
于 2013-09-04T09:00:39.760 回答
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 ;
于 2013-09-04T08:59:06.437 回答