【问题标题】:SQL - Get rows from all tables where a common column is nullSQL - 从公共列为空的所有表中获取行
【发布时间】:2015-12-08 21:41:34
【问题描述】:

我需要找到创建/更新日期为空的任何表中的所有行

有超过 500 个表,因此执行以下操作是不可行的。

SELECT * 
FROM 
    (SELECT 
         'tableA' AS `table`,
         IF(COUNT(`column_a`), NULL, 'column_a') AS `column`
     FROM tableA

     UNION ALL

     SELECT 
         'tableB' AS `table`,
         IF(COUNT(`column_b`), NULL, 'column_b') AS `column`
     FROM tableB

     UNION ALL
     -- etc.
     ) t 
WHERE 
    `column` IS NOT NULL

我想我可以以某种方式使用INFORMATION_SCHEMA,但我遇到了困难。

【问题讨论】:

  • 所以你有一堆表,它们都有 Create_Date 和 Update_Date 作为列?那么你需要每个表中每一行的所有信息,其中任一日期为 NULL?
  • 这被标记为 sql-server 但代码看起来很像 mysql。
  • INFORMATION_SCHEMA(或sys.tablessys.columns 等目录视图)为您提供有关数据库(静态)结构的信息 - 表名、列名称等 - 但关于内容(值 - NULL 或不)
  • 是的,您可以使用INFORMATION_SCHEMA 作为实现您需要的步骤。编写一个存储过程,在其中对每个表执行查询或构建一个查询。
  • SQL Server 有一个 sp_MSforeachtable 函数可以很好地解决这个问题。 social.technet.microsoft.com/wiki/contents/articles/16977.aspx

标签: sql sql-server information-schema


【解决方案1】:

我通常使用 sys.tables 将表列表填充到临时表中,然后围绕该列表编写动态 SQL。

select quotename( schemas.name ) + '.' + quotename(tables.name) as tbl
into #work 
from sys.tables
join sys.schemas on tables.schema_id = schemas.schema_id

select 

'select ''' + tbl + ''' as [table] where exists ( select * from ' + tbl + ' where column_a is null )' as sqlcmd,

'select ''' + tbl + ''' as [table], * from ' + tbl + ' where createdate is null ' as sqlcmd

from #work

drop table #work

获得列表后,您可以在 SSMS 中手动执行它或使用游标遍历它以执行每个语句。不过,引号可能会让您头疼。动态 SQL 不适合胆小的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多