将id,列名和值插入表SQL Server

时间:2011-02-28 17:10:49

标签: sql sql-server tsql sql-server-2008

我有一个包含一行和一些列的结果表:

column1  column2  column3   column4   column5   column6   column7  column8   column9
------------------------------------------------------------------------------------
   1.4       2.2      3.4       6.57      5.6       9.7      67.6      3.4      5.9  

我有一张表:

DECLARE @TTable TABLE(
 ID INT,
 Name VARCHAR(100),
 value FLOAT 
)

我想要像

这样的东西
ID   Name      value
----------------------
1    column1    1.4         
2    column2    2.2 
3    column3    3.4
4    column4    6.57
5    column5    5.6
6    column6    9.7
7    column7    67.6
8    column8    3.4
9    column9    5.9

所以我做的事情是:

INSERT @TTable   
SELECT [id]  = ORDINAL_POSITION,  
[Name] = COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS   
WHERE TABLE_NAME = 'ORIGINALTABLE' ORDER BY id   

此结果包含2个字段“id”和“Name”列,但您如何添加value字段?

如果我在查询中添加SELECT

INSERT @TTable   
SELECT [id]  = ORDINAL_POSITION,  
[Name] = COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS   
WHERE TABLE_NAME = 'ORIGINALTABLE' ORDER BY id,  [value] = ... 

2 个答案:

答案 0 :(得分:2)

如果您使用的是SQL Server 2008,则可以使用UNPIVOT和动态SQL,因此您不必自己编写每一列(在使用动态SQL之前,请先查看{{3} })。试试这个:

评论后更新

DECLARE @Columns NVARCHAR(MAX)='', @Query NVARCHAR(MAX)=''
DECLARE @CastColumns NVARCHAR(MAX)=''

SELECT  @Columns = @Columns + QUOTENAME(COLUMN_NAME) + ',',
        @CastColumns = @CastColumns+CASE WHEN data_type <> 'float' THEN
        'CAST('+QUOTENAME(COLUMN_NAME)+' AS FLOAT) AS '+QUOTENAME(COLUMN_NAME) ELSE
        QUOTENAME(COLUMN_NAME) END+','
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'YourTable' 
ORDER BY ORDINAL_POSITION

SET @Columns = LEFT(@Columns,LEN(@Columns)-1)
SET @CastColumns = LEFT(@CastColumns,LEN(@CastColumns)-1)

SET @Query = '
SELECT ROW_NUMBER() OVER(ORDER BY CO.Ordinal_Position) Id, ColumnName, Value
FROM (SELECT '+@CastColumns+' FROM YourTable) AS P
UNPIVOT(value FOR ColumnName IN ('+@Columns+')) AS UC
JOIN (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ''YourTable'') CO
ON ColumnName = CO.COLUMN_NAME
'

INSERT INTO @TTABLE
EXEC sp_executesql @Query

好的,现在我更改了查询,因此它对FLOAT上的FLOAT进行了CAST。让我知道它是怎么回事。

答案 1 :(得分:1)

您需要执行交叉表查询以从具有多列的行转换为具有几列的多个行,例如in this article。或者在Celko's fantastic Sql For Smarties Book

基本上你会做一系列的case语句,通过在轴上旋转它来转换表。