如何遍历SQL Server数据库中所有表中的所有列并返回与列值并列的列名?

时间:2014-05-12 13:45:04

标签: sql-server

我需要遍历我的sql server数据库中的所有表,并且对于每个表,我需要返回所有行的值,但是棘手的是我需要将列名元数据与该列的值并排返回。

例如,

column1 collumn2 column3
A   B   C
AA  BB  CC

对于这个表,我需要返回

column1     A   collumn2    B   column3 C
column1     AA  collumn2    BB  column3 

CC

我有脚本使用游标循环遍历所有表并在每个表中,返回所有列'名字(但不是价值)。

我还有脚本逐个返回列名和值,如

column1 A
column1 AA
column2 B
column2 BB
column3 C
column3 CC

但我需要为每行数据返回一行metadat +列vaue。有没有人有任何见解?我还在四处寻找。谢谢!

编辑: 我终于让脚本工作了

drop table #results
CREATE TABLE #Results (TypeColumnName nvarchar(100), TypeColumnValue int, CodeValueName nvarchar(100), CodeValueValue nvarchar(100), DescriptionName nvarchar(100), DescriptionValue nvarchar(1024) )

    SET NOCOUNT ON

    DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @sql nvarchar(max), @sql0 nvarchar(max)
    SET  @TableName = ''


    WHILE @TableName IS NOT NULL
    BEGIN

        SET @ColumnName = ''
        set @sql=''
        SET @TableName = 
        (
            SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
            FROM    INFORMATION_SCHEMA.TABLES
            WHERE       TABLE_TYPE = 'BASE TABLE'
            and table_schema = 'test'
            and table_name like 'sales%'
                AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
        )

        WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
        BEGIN

            SET @ColumnName =
            (
                SELECT MIN(QUOTENAME(COLUMN_NAME))
                FROM    INFORMATION_SCHEMA.COLUMNS
                WHERE       TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                    AND TABLE_NAME  = PARSENAME(@TableName, 1)
                    AND QUOTENAME(COLUMN_NAME) > @ColumnName
            )
            IF @ColumnName IS NOT NULL
            BEGIN
                --select @columnname
                set @sql = @sql + '''' + @TableName + '.' + @ColumnName + ''',' + @ColumnName + ', '

            END
            ELSE
            begin
            SET @sql = left(rtrim(@sql),Len(rtrim(@sql))-1) 
            set @sql = 'SELECT ' + @sql +   ' FROM ' + @TableName + ' (NOLOCK) ' 

    select @sql 
    INSERT INTO #Results
                EXEC sp_executesql @sql 
    end


END

end

2 个答案:

答案 0 :(得分:1)

这会让你入门吗?

select t.name, c.name, c.system_type_id , c.max_length 
         ,Case c.system_type_id
         when 167 then 'VarChar'
         When 231 then 'nVarChar'
         when 4 then 'Integer'
         when 56 then 'int'
         when 61 then 'DateTime'
         else 'Unknown'
         End 
   from sys.tables t
 inner join sys.columns c
    on c.object_id = t.object_id 
 order by t.name, c.column_ID

我在一起使用的这个T-SQL在SQL Server 2008 R2中运行

您可以使用sp_help找出其他未知的'列类型并自己在case语句中添加它们。

答案 1 :(得分:0)

使用UNPIVOT功能:

SELECT col1, colval FROM ( SELECT col1, col2, col3 FROM table1 ) UNPIVOT ( colval for colname IN (col2, col3) ) as unpiv

您可以根据需要在不同位置添加联接和where子句。在我的一个应用程序中,我在第一个查询中过滤并加入,然后将最终结果加入到更多表格等...

您也可以以非常类似的方式执行与PIVOT功能相反的操作。查看联机丛书中的这两项功能......我认为他们会为您解决问题。