如何创建select语句以返回不同的值,列名和表名?

时间:2015-07-15 22:16:02

标签: sql sql-server variables concat

我想创建一个SQL语句,它将返回数据库中代码字段的不同值,以及代码列的名称和列所在表的名称。

我有这样的事情:

select c.name as 'Col Name', t.name as "Table Name'
from sys.columns c, sys tables t
where c.object_id = t.object_id
and c.name like 'CD_%'

它会生成我想要的列和表列表,但显然不会返回列表中每个代码的任何值。

我的数据库中有超过100个表。我可以使用上面的结果集并为每个结果写一个查询:

Select distinct CD_RACE from PERSON

它将返回值,但它不会返回列和表名,而且我必须单独执行每一个。有什么办法可以在我的数据库中获取EACH代码的值,列名和表名吗?

有什么想法吗?感谢...

2 个答案:

答案 0 :(得分:0)

只需生成您的选择并将列和表名称作为静态值引入。这是Oracle版本:

选择'选择不同的'' || c.column_name ||'''' as" Col Name",''' || t.table_name ||''' as"表名",' || c.column_name ||'来自' || t.table_name ||';' 来自all_tab_columns c,all_tables t 其中c.table_name = t.table_name;

这将为您提供一堆单独的语句,您可以稍微修改查询以在每个选择之间放置一个联合,如果您真的想要执行一个超级查询以便一次获取所有代码值。

答案 1 :(得分:0)

这是SQL Server的一种方法,因为其他人覆盖了Oracle(以及未提及的特定DBMS。以下步骤已完成:

  1. 设置表以接收架构,表,列名和列值(在下面的示例中仅使用表变量)
  2. 构建要执行的SQL命令列表(使用空格等来计算各种模式和名称)
  3. 运行每个命令,将值从上面的#1
  4. 动态插入到设置表中
  5. 的输出结果

    以下是示例:

    -- Store the values and source of the values
    DECLARE @Values TABLE (
        SchemaName VARCHAR(500),
        TableName VARCHAR(500),
        ColumnName VARCHAR(500),
        ColumnValue VARCHAR(MAX)
    )
    
    -- Build list of SQL Commands to run
    DECLARE @Commands TABLE (
        Id INT PRIMARY KEY NOT NULL IDENTITY(1,1),
        SchemaName VARCHAR(500),
        TableName VARCHAR(500),
        ColumnName VARCHAR(500),
        SqlCommand VARCHAR(1000)
    )
    INSERT @Commands
        SELECT
            [TABLE_SCHEMA],
            [TABLE_NAME],
            [COLUMN_NAME],
            'SELECT DISTINCT '
                + '''' + [TABLE_SCHEMA] + ''', '
                + '''' + [TABLE_NAME] + ''', '
                + '''' + [COLUMN_NAME] + ''', '
                + '[' + [COLUMN_NAME] + '] '
                + 'FROM [' + [TABLE_SCHEMA] + '].[' + [TABLE_NAME] + ']'
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE COLUMN_NAME LIKE 'CD_%'
    
    -- Loop through commands
    DECLARE
        @Sql VARCHAR(1000),
        @Id INT,
        @SchemaName VARCHAR(500),
        @TableName VARCHAR(500),
        @ColumnName VARCHAR(500)
    WHILE EXISTS (SELECT * FROM @Commands) BEGIN
        -- Get next set of records
        SELECT TOP 1
            @Id = Id,
            @Sql = SqlCommand,
            @SchemaName = SchemaName,
            @TableName = TableName,
            @ColumnName = ColumnName
        FROM @Commands
    
        -- Add values for that command
        INSERT @Values
            EXEC (@Sql)
    
        -- Remove command record
        DELETE @Commands WHERE Id = @Id
    END
    
    -- Return the values and sources
    SELECT * FROM @Values