当前位置: 首页 > 面试题库 >

SQL对sys表中所有表的每个列中的所有空值进行计数

詹弘毅
2023-03-14
问题内容

我有以下SQL:

    SET NOCOUNT ON
DECLARE @Schema NVARCHAR(100) = 'dbo'
DECLARE @Table NVARCHAR(100) = NULL
DECLARE @sql NVARCHAR(MAX) =''
IF OBJECT_ID ('tempdb..#Nulls') IS NOT NULL DROP TABLE #Nulls

CREATE TABLE #Nulls (TableName sysname, ColumnName sysname, ColumnPosition int 
, NullCount int , NonNullCount int)

SELECT @sql += 'SELECT  '''+TABLE_NAME+''' AS TableName ,

'''+COLUMN_NAME+''' AS ColumnName,  '''+CONVERT(VARCHAR(5),ORDINAL_POSITION)+'''AS ColumnPosition,     
SUM(CASE WHEN '+COLUMN_NAME+' IS NULL THEN 1 ELSE 0 END) CountNulls ,   
COUNT(' +COLUMN_NAME+') CountnonNulls FROM   
'+QUOTENAME(TABLE_SCHEMA)+'.'+QUOTENAME(TABLE_NAME)+';'+ CHAR(10)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = @Schema AND (@Table IS NULL OR TABLE_NAME = @Table)

INSERT INTO #Nulls 
EXEC sp_executesql @sql

SELECT * 
FROM #Nulls

这将按照我期望的方式对所有null进行计数。但是,我想使用此sql遍历目录中的每个表,例如在

  information.schema.table

有人可以提供执行此操作所需的sql吗,我对使用游标一无所知。

谢谢


问题答案:

无需游标。只需将您设置@TableNULL

DECLARE @Table NVARCHAR(100) = NULL

然后WHERE从此更改您的条款

WHERE TABLE_SCHEMA = @Schema AND TABLE_NAME = @Table

WHERE TABLE_SCHEMA = @Schema AND (@Table IS NULL OR TABLE_NAME = @Table)

所以整个代码…

SET NOCOUNT ON
DECLARE @Schema NVARCHAR(100) = 'dbo'
DECLARE @Table NVARCHAR(100) = NULL
DECLARE @sql NVARCHAR(MAX) =''
IF OBJECT_ID ('tempdb..#Nulls') IS NOT NULL DROP TABLE #Nulls

CREATE TABLE #Nulls (TableName sysname, ColumnName sysname, ColumnPosition int 
, NullCount int , NonNullCount int)

SELECT @sql += 'SELECT  '''+TABLE_NAME+''' AS TableName ,

'''+COLUMN_NAME+''' AS ColumnName,  '''+CONVERT(VARCHAR(5),ORDINAL_POSITION)+'''AS ColumnPosition,     
SUM(CASE WHEN '+COLUMN_NAME+' IS NULL THEN 1 ELSE 0 END) CountNulls ,   
COUNT(' +COLUMN_NAME+') CountnonNulls FROM   
'+QUOTENAME(TABLE_SCHEMA)+'.'+QUOTENAME(TABLE_NAME)+';'+ CHAR(10)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = @Schema AND (@Table IS NULL OR TABLE_NAME = @Table)

INSERT INTO #Nulls 
EXEC sp_executesql @sql

SELECT * 
FROM #Nulls


 类似资料:
  • 问题内容: 我正在编写一些db实用程序脚本,我需要做的任务之一是仅重建数据,而保持架构不变。使用bash和mysql工具(无php等)从命令行自动执行此操作的最简单方法是什么? 更新:我希望该解决方案可以在一个命令中处理所有表,并且如果可能的话,如果添加或删除了表,则不需要更新。 问题答案: 这将清空表的内容。 响应Q编辑:从我的快速测试中看来,您将必须至少执行2个查询,因为似乎“显示表”不能用作

  • 问题内容: 我有一个关于SQL-select-query的问题:该表包含几列,其中一列是一个名为“ size”的整数列- 我要执行的任务是查询表以获取所有总和行(它们的值),或更确切地说,在我的ResultSet中获得一个称为“ overallSize”的人工列,其中包含表中所有“大小”值的总和。最好使用WHERE子句仅添加某些值(“ WHERE bla = 5”或类似的值)。 数据库引擎是HSQ

  • 问题内容: 我需要重命名数据库中所有表中的列。因此必须在所有表中将“ OldColumn”列重命名为“ NewColumn” 我可以使用此查询获取具有此列的表的列表: 但是,如何在所有表中重命名它却尽可能简单,而不必编写游标呢? 问题答案: 当然,您不需要为此使用光标。您可以使用sys.columns和sys.objects生成动态sql。然后简单地执行它。一旦您对动态sql感到满意,就可以随意取

  • 问题内容: 我有一个包含许多列的巨大表,并且我知道该列有时带有一些特定的值’MyValue’。如何在一个包含“ MyValue”的特定表中选择所有行,而不管在哪一列中。 我在这里找到相关主题: 如何在SQLServer数据库的任何位置找到值? 但是我的查询需要一个较小的大炮。我知道表名,就是“ MyTable”。我不需要搜索整个数据库。 问题答案: 要在一个简单的语句中不使用特殊过程的情况下执行此

  • 问题内容: 我创建了许多对象,然后将它们存储在列表中。但是我想在一段时间后删除它们,因为我创建了一个新闻,并且不希望我的内存过高(就我而言,如果不删除它,它会跳到20 gigs的内存)。 这里有一些代码来说明我要做什么: A和B是我的对象。C是这两个对象的列表。我正在尝试使用C中的for循环将其删除:一次是使用DEL,另一次是使用一个函数。它似乎不起作用,因为打印继续显示对象。 我需要这个,因为我

  • 问题内容: 如何使用查询获取SQL Server数据库中所有表的列表。我的意图是将其动态显示在网页上。 问题答案: 尝试: 这应该给您您想要的。然后,您需要从网页中调用它,以所需格式显示。 您可能要看: 如何使用C#在组合框中从数据库获取所有表的名称 可能会帮助您完成您想做的事情。 另外-您可能想看一下SQL Server:我应该在sys表上使用information_schema表吗? 用于sy