单个 SQL 查询查找数据库中所有列中的空值

2024-02-23

我想确定所有表中每列中空值的数量。我有一个数据库,它由大约 250 个表组成。其中大多数都在使用中。问题是几乎所有表都包含为某些短期创建的不需要的列术语使用。现在我们想要识别所有表中具有空值的列。由于表的计数很大并且时间较少。我想知道一种最简单的方法来按列识别每个表上的空记录计数。

我尝试了从互联网上获得的这个查询。但是在这个查询中我必须手动给出每个表名称。

DECLARE @cols1 NVARCHAR(MAX);
DECLARE @sql NVARCHAR(MAX);

SELECT @cols1 = STUFF((
    SELECT ', COUNT(CASE WHEN ISNULL(CONVERT(NVARCHAR(MAX), [' + t1.NAME + ']),'''' ) = '''' THEN 1 END) AS ' + t1.name
    FROM sys.columns AS t1
    WHERE t1.object_id = OBJECT_ID('Area')
    -- ORDER BY ', COUNT([' + t1.name + ']) AS ' + t1.name
    FOR XML PATH('')
), 1, 2, '');

SET @sql = '
SELECT ' + @cols1 + '
FROM Area
'
EXEC(@sql)

请帮助我改进查询获取结果。

Thanku


这是一团糟,但它有效:

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

CREATE TABLE #NullCounts (SchemaName sysname,
                          TableName sysname,
                          ColumnName sysname,
                          NULLCount bigint);

DECLARE @Delimiter nchar(3) = ',' +@CRLF;

SET @SQL = STUFF((SELECT @CRLF + @CRLF +
                         N'WITH Counts AS(' + @CRLF +
                         N'    SELECT N' + QUOTENAME(s.[name],'''') +N' AS SchemaName,' + @CRLF +
                         N'           N' + QUOTENAME(t.[name],'''') +N' AS TableName,' + @CRLF +
                         STRING_AGG(N'           COUNT_BIG(CASE WHEN ' + QUOTENAME(c.[name]) + N' IS NULL THEN 1 END) AS ' + QUOTENAME(c.[name]),@Delimiter) WITHIN GROUP(ORDER BY c.column_id) + @CRLF +
                         N'    FROM ' + QUOTENAME(s.[name]) + N'.' + QUOTENAME(t.[name]) + N' T)' + @CRLF +
                         N'INSERT INTO #NullCounts(SchemaName, TableName, ColumnName, NULLCount)' + @CRLF +
                         N'SELECT SchemaName,' + @CRLF +
                         N'       TableName,' + @CRLF +
                         N'       V.ColumnName,' + @CRLF +
                         N'       V.NULLCount' + @CRLF +
                         N'FROM Counts C' + @CRLF +
                         N'     CROSS APPLY (VALUES' +
                         STUFF(STRING_AGG(N'                        (N' + QUOTENAME(c.[name], '''') + N', C.' + QUOTENAME(c.[name]) + N')',@Delimiter) WITHIN GROUP (ORDER BY c.column_id),1,24,N'') + N')V(ColumnName,NULLCount);'
                  FROM sys.schemas s
                       JOIN sys.tables t ON s.schema_id = t.schema_id
                       JOIN sys.columns c ON t.object_id = c.object_id
                  GROUP BY s.[name], t.[name]
                  FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,4,N'');
     
--PRINT @SQL; --This is gunna be way longer than 4,000 characters, so you'll want SELECT

EXEC sys.sp_executesql @SQL;

GO

SELECT *
FROM #NullCounts
ORDER BY SchemaName,
         TableName,
         ColumnName;

GO

DROP TABLE #NullCounts;

是的,我混合STRING_AGG and FOR XML PATH,是的,它有点碍眼,但是打印的(选定的)SQL 会生成一些非常好的语句。见下文:

WITH Counts AS(
    SELECT N'dbo' AS SchemaName,
           N'PerformanceTest' AS TableName,
           COUNT_BIG(CASE WHEN TestID IS NULL THEN 1 END) AS [TestID],
           COUNT_BIG(CASE WHEN TestTarget IS NULL THEN 1 END) AS [TestTarget],
           COUNT_BIG(CASE WHEN TestName IS NULL THEN 1 END) AS [TestName],
           COUNT_BIG(CASE WHEN TimeStart IS NULL THEN 1 END) AS [TimeStart],
           COUNT_BIG(CASE WHEN TimeEnd IS NULL THEN 1 END) AS [TimeEnd],
           COUNT_BIG(CASE WHEN TimeTaken_ms IS NULL THEN 1 END) AS [TimeTaken_ms],
           COUNT_BIG(CASE WHEN TotalRows IS NULL THEN 1 END) AS [TotalRows],
           COUNT_BIG(CASE WHEN RowSets IS NULL THEN 1 END) AS [RowSets],
           COUNT_BIG(CASE WHEN AvgRowsPerSet IS NULL THEN 1 END) AS [AvgRowsPerSet]
    FROM [dbo].[PerformanceTest] T)
INSERT INTO #NullCounts(SchemaName, TableName, ColumnName, NULLCount)
SELECT SchemaName,
       TableName,
       V.ColumnName,
       V.NULLCount
FROM Counts C
     CROSS APPLY (VALUES(N'TestID', C.[TestID]),
                        (N'TestTarget', C.[TestTarget]),
                        (N'TestName', C.[TestName]),
                        (N'TimeStart', C.[TimeStart]),
                        (N'TimeEnd', C.[TimeEnd]),
                        (N'TimeTaken_ms', C.[TimeTaken_ms]),
                        (N'TotalRows', C.[TotalRows]),
                        (N'RowSets', C.[RowSets]),
                        (N'AvgRowsPerSet', C.[AvgRowsPerSet]))V(ColumnName,NULLCount);

WITH Counts AS(
    SELECT N'dbo' AS SchemaName,
           N'someTable' AS TableName,
           COUNT_BIG(CASE WHEN id IS NULL THEN 1 END) AS [id],
           COUNT_BIG(CASE WHEN SomeCol IS NULL THEN 1 END) AS [SomeCol]
    FROM [dbo].[someTable] T)
INSERT INTO #NullCounts(SchemaName, TableName, ColumnName, NULLCount)
SELECT SchemaName,
       TableName,
       V.ColumnName,
       V.NULLCount
FROM Counts C
     CROSS APPLY (VALUES(N'id', C.[id]),
                        (N'SomeCol', C.[SomeCol]))V(ColumnName,NULLCount);

是的,我真的花了最后 45 分钟写下所有这些……

老实说,这不是入门级的,如果你不理解它,你就不应该使用它;而且,我非常怀疑您是否会找到一个不同的入门级解决方案,并且性能与此一样。A CURSOR,例如,虽然可能更容易理解,但是这样做会很慢.

Caveat:如果您的数据库中有任何已弃用的数据类型(即text)这将会失败。如果是这种情况,您需要确保从查询中消除它们WHERE。但是,我建议您修复数据类型(text,例如,已被弃用 15 年)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单个 SQL 查询查找数据库中所有列中的空值 的相关文章

  • 在 SQL Server 中将 UTC 毫秒转换为 DATETIME

    我想在 SQL Server 中将 UTC 毫秒转换为 DateTime 这可以通过以下代码在 C 中轻松完成 DateTime startDate new DateTime 1970 1 1 AddMilliseconds 1348203
  • 使用转义换行符和回车符取消转义字符串

    我正在尝试编写一个 PLPGSQL 函数来混淆 审查 编辑文本 Obfuscate a body of text by replacing lowercase letters and numbers with symbols CREATE
  • Oracle 删除约束级联等效于 Sql Server

    在Oracle中 删除约束PK SAI我使用语法 ALTER TABLE SAISIE DROP CONSTRAINT PK SAI CASCADE SQL Server 中与此等效的是什么 您正在考虑与实际 DELETE 语句相关的 FO
  • 与 SQL 中的 IN 运算符相反

    我怎么能做相反的事情 换句话说 选择所有姓氏不是 Hansen 或 Pettersen 的人 WHERE lastname NOT IN Hansen Pettersen 请参阅 IN 和 NOT IN 运算符 部分SQLite 所理解的
  • 如何检查oracle数据库中分配给模式、角色的对象的权限(DDL、DML、DCL)?

    大多数时候 我们都在与愚蠢的事情作斗争 以获取架构 角色及其对象的权限详细信息 并尝试找到一些简单的方法来获取有关它的所有详细信息以及伪查询代码 以批量生成授予语句以供进一步使用执行 所以我们在这里得到它 关于数据字典视图前缀的一些简单介绍
  • 如何将 sql 数据输出到 QCalendarWidget

    我希望能够在日历小部件上突出显示 SQL 数据库中的一天 就像启动程序时突出显示当前日期一样 在我的示例中 它是红色突出显示 我想要发生的是 当用户按下突出显示的日期时 数据库中日期旁边的文本将显示在日历下方的标签上 这是我使用 QT De
  • Oracle 按月滚动或运行总计

    目标 每个月末所有报表的滚动 运行总计 Code select TRUNC ACTHX STMT HX STMT DATE MM AS MNTH COUNT ACTHX INVOICE as STMTS from ACTHX group b
  • REGEXP_REPLACE - 仅当包含在 () 中时才从字符串中删除逗号

    我在 oracle 论坛网站找到了一个例子 输入字符串 a b c x y z a xx yy zz x WITH t AS SELECT a b c x y z a xx yy zz x col1 FROM dual SELECT t c
  • 创建日期范围表

    我正在编写一份需要显示每天值的报告 我有查询的开始日期和结束日期 但我希望避免丢失日期 以防表不包含特定日期的值 我正在考虑创建一个基本日期范围表 其中包含开始和结束之间的所有日期 然后将其与数据表左连接以显示每一天的值 我找到了一些适用于
  • 最近邻居的 Postgis SQL

    我正在尝试计算最近的邻居 为此 我需要传递一个参数来限制与邻居的最大距离 例如 半径1000米内最近的邻居是哪些 我做了以下事情 我用数据创建了表 id name latitude longitude 之后 我执行了以下查询 SELECT
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe
  • 我可以根据多列删除数据库重复项吗?

    I 不久前问过这个问题 https stackoverflow com questions 4952250 how to delete duplicates from a database table based on a certain
  • MySQL LIKE %string% 不够宽容。我还有什么可以用的吗?

    我有一位客户询问他们的搜索是否可以搜索公司名称 这些名称可以根据用户输入以多种格式进行搜索 例如数据库中存储的公司是 A J R Kelly Ltd 如果用户搜索 一个 J R Kelly 被发现 使用
  • 我应该使用平面表还是标准化数据库?

    我目前正在开发一个使用 MySQL 数据库作为后端的 Web 应用程序 在继续下一步之前 我需要知道什么更适合我的情况 简而言之 在这个应用程序中 用户将能够使用任何数字字段 他们决定 构建自己的表单 现在我将其全部存储在通过外键链接的几个
  • 如何进行数据透视并计算列平均值

    我承认这是迄今为止我必须面对的最复杂的 SQL 语句之一 我在这件事上碰壁了 我希望有人能帮我一把 我在数据库中有这张表 Item ActiveTime sec DateTime 1 10 2013 06 03 17 34 22 gt Mo
  • Magento --“SQLSTATE[23000]:违反完整性约束..”客户更新

    迁移服务器后 每次尝试更新客户信息时都会出现错误 我正在使用一个客户激活插件 http www magentocommerce com magento connect vinai extension 489 customer activat
  • ASP SQL Server 连接

  • 在 PostgreSql 中计算百分比

    例如我有一个这样的表 string adm A 2 A 1 B 2 A 1 C 1 A 2 通过 SQL 查询 我想要这样的结果 string perc adm A 50 B 100 C 0 我想要每个字符串中数字 2 出现的百分比 我可以
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • SQL Server 2008 错误 233

    我正在使用以下 sql 脚本在 SQL Server 2008 中创建新登录名 CREATE LOGIN xyz WITH PASSWORD xyz DEFAULT DATABASE master DEFAULT LANGUAGE us e

随机推荐

  • 如何从内存字节创建“假”dart:io 文件?

    我有一个 blob 的内存字节 但我想要处理这个 blob 的 API 只接受 dart io File 对象 有没有办法创建一个 假 dart io File 简单地包装我的内存字节 以便我可以将这个 假 文件传递给我的API 假设文件系
  • 在 C++ 程序上使用 mpicc 链接失败

    我正在运行 Ubuntu 11 04 64 位 我已经安装了 OpenMPI 我正在尝试构建以下代码 这是 Gropp Lusk Skjellum 所著的 Using MPI 一书中测试问题的片段 include
  • 在java中如何拥有具有唯一键的HashMap?

    在 Java 中如何获得具有唯一键的 HashMap 或者甚至在 HashMap 中拥有唯一的键是否有意义 或者默认情况下键是唯一的 我是新手 谢谢 哈希映射键是唯一的 添加重复的密钥 然后它将被覆盖 HashMap hm new Hash
  • PE文件中的MZ签名有什么用?

    我正在开发一个程序 它将解析 PE 对象以获取各种信息 但阅读规范后 我无法找出为什么存在 MZ 字节 因为我无法在这 2 个字节应该代表的机器类型列表中找到它 谁能澄清一下吗 MZ 签名是 MS DOS 可重定位 16 位 EXE 格式使
  • 即时搜索算法

    哪种类型的算法对于搜索正在搜索的内容最快 我意识到这已经很接近于问谷歌即时搜索是如何工作的了 但我不是算法专家 而且我对它们越来越感兴趣 像这样的搜索是使用后缀树或类似的东西完成的吗 我想我只是对查询小字符串感兴趣 而不是像谷歌那样查询大量
  • 将 HttpClient 与 SOAP 结合使用

    我一直在尝试使用 Net Framework 4 7 中的 HTTPClient 对象来创建简单的 SOAP 请求 我已经使用了 Postman 中的参数 它工作得很好 这是我的代码 string url http webservices
  • 在 Java 中获取“外部”IP 地址

    我不太确定如何获取机器的外部 IP 地址 因为网络外部的计算机会看到它 我的以下 IPAddress 类仅获取计算机的本地 IP 地址 public class IPAddress private InetAddress thisIp pr
  • ASP.NET 健康监控 404 事件

    HealthMonitoring 是否有捕获 404 错误的内置事件 我已尝试设置所有事件 通过使用 webBaseEvent 并且搜索了两天 但我无法找到或触发未找到文件的事件 我可以创建自己的活动 但希望有一个内置的活动 不 事实并非如
  • window.onload 似乎在 DOM 加载之前触发(JavaScript)

    我遇到了问题window onload and document onload事件 我读到的所有内容都告诉我 在 DOM 完全加载所有资源之前 这些不会触发 这似乎不会发生在我身上 我在 Chrome 4 1 249 1036 41514
  • Twitter 引导下拉菜单在点击时禁用了按钮的原始功能

    所以我刚刚开始使用引导程序的下拉菜单 这很方便 但我有一个问题 为了让下拉菜单发挥作用 似乎在添加 html 属性时完全禁用了触发下拉的元素 dropdown toggle 的原始功能data toggle dropdown 这是有道理的
  • 如何找到未记录的 .NET / COM 库函数?

    如何找出从某些 NET 函数返回的 COM 对象的属性和方法 而这些函数似乎没有记录 在我正在查看的特定示例中 我使用以下函数将图片插入 Excel 中 Set NewPic ActiveSheet Pictures Insert File
  • 无法确定主机“github.com(192.30.252.128)”的真实性

    我正在尝试使用 sudo npm install 为用 Node js 编写的应用程序安装所有依赖项 我的操作系统是 Ubuntu 13 04 但是 我不断收到此警告 The authenticity of host github com
  • 为什么将演示文稿保存到类似文件的对象会产生空白演示文稿?

    作为回应这个答案 https stackoverflow com a 46980767 1868136对于我之前的问题 我编写了以下简短的程序来尝试重现该问题 from pptx import Presentation from io im
  • 即使调用“SetWindowPos()”后,“SetWindowLong()”函数也不会更改窗口样式

    我使用以下代码创建静态控件 hWnd CreateWindowExW 0 L STATIC Content c str SS LEFT WS VISIBLE WS CHILD SS SUNKEN 200 120 120 40 hWndPar
  • 如何使用 PyUSB 写入控制端点

    我有一个 USB 设备 其代码如下 import usb core import usb util device usb core find idVendor 0xC251 idProduct 0x2201 print device pro
  • 作为类中的成员“变量”起作用

    我正在考虑如何使用一些先进的技术来改进我的简单计算器 我想问 是否有某种方法可以创建一个具有可以为每个实例定义的函数的类 class Function public Function function Function private fu
  • Android 设备的后退和主页按钮按下事件 (cocos2d-x 3)

    我这样做是为了抓住Home and BackAndroid 设备上的按钮按下事件 被覆盖void Layer onKeyReleased EventKeyboard KeyCode keyCode Event event 像这样的函数 vo
  • 线程优先级和线程精度

    线程优先级会提高准确性吗Thread sleep 50 我们知道 当您调用 sleep 50 毫秒时 线程并不准确 但是它是否会提高准确性呢 如果线程被列为MAX PRIORITY 将感谢任何形式的解释 睡眠的准确性取决于操作系统 如果您想
  • 无法访问 HTMLCollection 的值

    测试 html
  • 单个 SQL 查询查找数据库中所有列中的空值

    我想确定所有表中每列中空值的数量 我有一个数据库 它由大约 250 个表组成 其中大多数都在使用中 问题是几乎所有表都包含为某些短期创建的不需要的列术语使用 现在我们想要识别所有表中具有空值的列 由于表的计数很大并且时间较少 我想知道一种最