如何在行中显示一行,其中每行包含列名,另一行包含值?

时间:2010-09-27 09:41:36

标签: sql sql-server-2005 select

我有一个包含大约60列的表格,如果我在查询分析器中编写一个选择查询来获取它显示它的行,我必须滚动显示数据..
如何获得一行显示为60行,每行包含2列,一列用于列名,另一行用于值
例如,Select * from table where id = 1默认情况下显示为

ID Col1  Col2  Col3 Col4 Col5 ...... Col60  
1  v1    v2    v3   v4   v5   ...... v60

我希望它显示为

ID    1  
Col1  v1  
Col2  v2  
Col3  v3
...  
Col60 v60

2 个答案:

答案 0 :(得分:3)

以下存储过程执行您需要的操作

CREATE PROCEDURE [dbo].[Rotat]
    -- Add the parameters for the stored procedure here
     @Where nvarchar(max),
     @tableName nvarchar(max)
AS
BEGIN

Declare @SqlQuery nvarchar(max),@ColumnName nvarchar(255)
DECLARE @TempTable TABLE 
( 
      ID int IDENTITY(1,1) , 
      ColumnName nvarchar(255), 
      ColumnValue ntext 
)


INSERT INTO @TempTable (ColumnName)
    SELECT      column_name
    FROM information_schema.columns
    WHERE table_name = @tableName 

Declare @index int
Set @index = 1;  

Declare @Count int
Select @Count = Count(ID) from @TempTable
declare @columnValue  nvarchar(255)
declare @paraDef nvarchar(max)
declare @string nvarchar(max)

WHILE @index <= @Count 
BEGIN
    Select @ColumnName = ColumnName from @TempTable where id = @index
    set @string ='select @ret= cast('+ @ColumnName + ' AS nvarchar(255) )  
        from '+@tableName+' WHERE ' + @Where

    set  @paraDef=N'@ret nvarchar(255) output'

    EXECUTE sp_executesql @string, @paraDef,@ret=@ColumnValue  output

    UPDATE  @TempTable 
    SET     ColumnValue = @columnValue
    WHERE   ID =@index

    Set @index = @index + 1
END

Select * from @TempTable

END

只需将其称为传递表名称和您将返回一行的条件,例如

EXEC    [dbo].[Rotat]
        @Where = 'UserID = 123456',
        @tableName = 'Users'

答案 1 :(得分:0)

如果您想要一种非常快速的技术来查看转置的数据(正如您的问题似乎建议的那样),请尝试将结果网格中的输出复制并粘贴到Excel中,然后复制Excel数据并使用“选择性粘贴”转置输出