【问题标题】:How to get all columns that are used from various tables?如何从各种表中获取所有使用的列?
【发布时间】:2015-05-05 23:06:58
【问题描述】:

假设我有 10 个表 (Table1 - Table10) 和每个表中的 10 列(假设 Column1 - Column10) - 跨表的列名相同。我想在所有表中为该表中的至少一行找到not NULL 的所有列,并将它们插入到临时表中,例如@usedColumns,稍后将在存储过程中使用。

假设您在任何或所有这些表中都有数百万条记录,那么最快、最有效的方法是什么?当前实现使用UNPIVOT,但我正在尝试重新设计该存储过程,因为它的运行速度非常慢。或者UNPIVOT真的是最有效的方式吗?

我想的一种方法是只检查if exists,但不知道如何将其放入一个有效的循环中:

if exists (select top 1 1
    from Table1
    where Column1 is not null)
    insert into @usedColumns ( table_name, column_name )
    values                   ( 'Table1',   'Column1'   );

if exists (select top 1 1
    from Table1
    where Column2 is not null)
    insert into @usedColumns ( table_name, column_name )
    values                   ( 'Table1',   'Column2'   );
...

有问题的数据库是 SQL Server,但我猜该解决方案也适用于 MySQL 和其他数据库。

【问题讨论】:

  • 我知道在 MySQL 中这样做的唯一方法是使用 INFORMATION_SCHEMA.COLUMNS 和 PREPARE-ing 构造的查询。

标签: mysql sql-server stored-procedures


【解决方案1】:

我会这样做。抱歉,我是用手机打字的。

declare @sql nvarchar(max)
declare @count int = 1
declare @tablename nvarchar(20)

while @count < 11
begin    
    select @tablename = concat('table', @count)    
    select @sql = concat('select * from '
                    , @tablename
                    , ' where column1 is not null...')    
    --select @sql
    exec sp_sqlexec @sql    
    select @count = @count + 1    
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多