Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何循环SQL server数据库中所有表中的所有列,并返回与列值并列的列名?_Sql Server - Fatal编程技术网

Sql server 如何循环SQL server数据库中所有表中的所有列,并返回与列值并列的列名?

Sql server 如何循环SQL server数据库中所有表中的所有列,并返回与列值并列的列名?,sql-server,Sql Server,我需要遍历sql server数据库中的所有表,对于每个表,我需要为所有行返回值,但棘手的是,我需要将列名元数据与该列的值并排返回 比如说, column1 collumn2 column3 A B C AA BB CC 对于这张桌子,我需要返回 column1 A collumn2 B column3 C column1 AA collumn2 BB column3 抄送 我有一个脚本,它使用游标在所有表中循环,并在每个表中返回所有列的

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

比如说,

column1 collumn2 column3
A   B   C
AA  BB  CC
对于这张桌子,我需要返回

column1     A   collumn2    B   column3 C
column1     AA  collumn2    BB  column3 
抄送

我有一个脚本,它使用游标在所有表中循环,并在每个表中返回所有列的名称,但不返回值

我还让脚本一个接一个地返回列名和值,如下所示

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

这能让你开始吗

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在SQLServer2008R2中工作


您可以使用sp_help找出其他“未知”列类型,并自己将其添加到case语句中。

使用UNPIVOT功能:

选择col1,colval 从…起 选择col1、col2、col3 来自表1 UNPIVOT col2、col3中colname的colval 作为unpiv

您可以在不同的位置添加联接和where子句,以便根据需要进行筛选。在我的一个应用程序中,我在第一个查询中进行了筛选和联接,然后将最终结果联接到多个表中,等等


您还可以以非常类似的方式使用PIVOT功能进行反向操作。这两个功能请在线阅读相关书籍。。。我想他们会帮你解决问题的

你用什么语言编程?您希望输出到哪里?归档?到屏幕上?也许如果你说你正在对数据做什么,我们可以建议更好。T-SQL。我希望输出转到全局临时表。谢谢大家!@cometbill,我需要这个输出,因为我将在这个输出中循环并使用列名和值构造CASE WHEN语句。非常感谢@cometbill,不幸的是,这只提供了元数据,而我需要查看列名之外的列的实际值,以便构造case语句。这主要用于查找表,例如,它有代码列和描述列,因此我可以在[code column name]=“code value”然后[description column name]=“description value”@Wendy需要元数据和数据时构建case语句作为case?一旦字段中包含一些数据,就可以确定字段类型。我不知道为什么只有当代码值是某个代码时才要设置description值。约翰,我忘记了UNPIVOT函数——我只是尝试了一下,但它仍然不能解决我的问题,因为我还需要输入列名。但手边有这个很好。多谢!当我运行它时,我会得到列名和相应的值。所以基本上它把我的宽桌子变成了一张高桌子。我想如果你继续尝试,它会满足你的需要。