Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ms sql server如何检查表是否有“id”列,如果有“id”,如何计数行_Sql_Sql Server - Fatal编程技术网

ms sql server如何检查表是否有“id”列,如果有“id”,如何计数行

ms sql server如何检查表是否有“id”列,如果有“id”,如何计数行,sql,sql-server,Sql,Sql Server,我的SQL Server数据库中的表太多。其中大多数都有“id”列,但有些没有。我想知道哪些表没有“id”列,如果存在“id”列,我想统计id=null的行。查询结果可能如下所示: TABLE_NAME | HAS_ID | ID_NULL_COUNT | ID_NOT_NULL_COUNT table1 | false | 0 | 0 table2 | true | 10 | 100 如何编写此查询?

我的SQL Server数据库中的表太多。其中大多数都有“id”列,但有些没有。我想知道哪些表没有“id”列,如果存在“id”列,我想统计id=null的行。查询结果可能如下所示:

TABLE_NAME |  HAS_ID |  ID_NULL_COUNT | ID_NOT_NULL_COUNT
  table1   |  false  |     0          |    0
  table2   |  true   |    10          |    100

如何编写此查询?

这将为您提供有关哪些表具有或不具有名为ID的列的信息:

SELECT Table_Name 
       , case when column_name not like '%ID%' then 'false'
              else 'true'
         end as HAS_ID 
FROM INFORMATION_SCHEMA.COLUMNS;
下面是一种方法,您可以使用它来选择所有具有名为ID的列的表,以及这些列是否为null:

CREATE TABLE #AllIDSNullable (TABLE_NAME  NVARCHAR(256) NOT NULL
                              , HAS_ID VARCHAR(10)
                              , ID_NULL_COUNT INT DEFAULT 0
                              , ID_NOT_NULL_COUNT INT DEFAULT 0);

DECLARE CT CURSOR FOR 
SELECT Table_Name 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name = 'ID';

DECLARE @name NVARCHAR(MAX), @SQL NVARCHAR(MAX);

OPEN CT; FETCH NEXT FROM CT INTO @name;

WHILE @@FETCH_STATUS=0 BEGIN
    SET @SQL = 'INSERT #AllIDSNullable (TABLE_NAME , HAS_ID) SELECT Table_Name, case when column_name not like ''%ID%'' then ''false'' else ''true'' end FROM INFORMATION_SCHEMA.COLUMNS;';
    EXEC (@SQL);

    SET @SQL = 'UPDATE #AllIDSNullable SET ID_NULL_COUNT = (SELECT COUNT(*) FROM ['+@name+'] WHERE ID IS NULL), ID_NOT_NULL_COUNT = (SELECT COUNT(*) FROM ['+@name+'] WHERE ID IS NOT NULL) WHERE TABLE_NAME='''+@name+''';';
    EXEC (@SQL);

    FETCH NEXT FROM CT INTO @name;
END;
CLOSE CT;

SELECT *
FROM #AllIDSNullable;
结果:


这将为您提供有关哪些表具有或不具有名为ID的列的信息:

SELECT Table_Name 
       , case when column_name not like '%ID%' then 'false'
              else 'true'
         end as HAS_ID 
FROM INFORMATION_SCHEMA.COLUMNS;
下面是一种方法,您可以使用它来选择所有具有名为ID的列的表,以及这些列是否为null:

CREATE TABLE #AllIDSNullable (TABLE_NAME  NVARCHAR(256) NOT NULL
                              , HAS_ID VARCHAR(10)
                              , ID_NULL_COUNT INT DEFAULT 0
                              , ID_NOT_NULL_COUNT INT DEFAULT 0);

DECLARE CT CURSOR FOR 
SELECT Table_Name 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name = 'ID';

DECLARE @name NVARCHAR(MAX), @SQL NVARCHAR(MAX);

OPEN CT; FETCH NEXT FROM CT INTO @name;

WHILE @@FETCH_STATUS=0 BEGIN
    SET @SQL = 'INSERT #AllIDSNullable (TABLE_NAME , HAS_ID) SELECT Table_Name, case when column_name not like ''%ID%'' then ''false'' else ''true'' end FROM INFORMATION_SCHEMA.COLUMNS;';
    EXEC (@SQL);

    SET @SQL = 'UPDATE #AllIDSNullable SET ID_NULL_COUNT = (SELECT COUNT(*) FROM ['+@name+'] WHERE ID IS NULL), ID_NOT_NULL_COUNT = (SELECT COUNT(*) FROM ['+@name+'] WHERE ID IS NOT NULL) WHERE TABLE_NAME='''+@name+''';';
    EXEC (@SQL);

    FETCH NEXT FROM CT INTO @name;
END;
CLOSE CT;

SELECT *
FROM #AllIDSNullable;
结果:


这可能对你有用。。。列出具有id列的所有表的行数。它会过滤掉以sys开头的表,因为这些表大多是内部表。如果您有一个以sys开头的表,您可能需要删除WHERE子句的该部分

SELECT DISTINCT OBJECT_NAME(r.[object_id]) AS [TableName], [row_count] AS [RowCount]
FROM sys.dm_db_partition_stats r
WHERE index_id = 1
  AND EXISTS (SELECT 1 FROM sys.columns c WHERE c.[object_id] = r.[object_id] AND c.[name] = N'id')
  AND OBJECT_NAME(r.[object_id]) NOT LIKE 'sys%'
ORDER BY [TableName] 

注意:您可以将c.[name]=N'id'更改为任何列名,甚至可以将=更改为仅查找没有id列的表,这可能对您有用。。。列出具有id列的所有表的行数。它会过滤掉以sys开头的表,因为这些表大多是内部表。如果您有一个以sys开头的表,您可能需要删除WHERE子句的该部分

SELECT DISTINCT OBJECT_NAME(r.[object_id]) AS [TableName], [row_count] AS [RowCount]
FROM sys.dm_db_partition_stats r
WHERE index_id = 1
  AND EXISTS (SELECT 1 FROM sys.columns c WHERE c.[object_id] = r.[object_id] AND c.[name] = N'id')
  AND OBJECT_NAME(r.[object_id]) NOT LIKE 'sys%'
ORDER BY [TableName] 
注意:您可以将c.[name]=N'id'更改为任何列名,甚至可以将=更改为仅查找没有id列的表

生成查询:

WITH cte AS (
  SELECT t.*, has_id = CASE WHEN COLUMN_NAME = 'ID' THEN 'true' ELSE 'false' END
  FROM INFORMATION_SCHEMA.TABLES t
  OUTER APPLY (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS c
               WHERE t.TABLE_NAME = c.TABLE_NAME
                 AND t.[TABLE_SCHEMA] = c.[TABLE_SCHEMA]
                 AND c.COLUMN_NAME = 'id') s
  WHERE t.TABLE_SCHEMA IN (...)
)
SELECT 
 query_to_run = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
   'SELECT tab_name      = ''<tab_name>'',
           has_id        = ''<has_id>'',
           id_null_count = <id_null_count>,
           id_not_null_count = <id_not_null_count>
    FROM <schema_name>.<tab_name>'
,'<tab_name>', TABLE_NAME)
,'<schema_name>', TABLE_SCHEMA)
,'<has_id>', has_id)
,'<id_null_count>', CASE WHEN has_id = 'false' THEN '0' ELSE 'SUM(CASE WHEN id IS NULL THEN 1 END)' END)
,'<id_not_null_count>', CASE WHEN has_id = 'false' THEN '0' ELSE 'COUNT(id)' END)
FROM cte;
复制输出并在单独的窗口中执行。可以添加UNION ALL以获得单个结果集

楼宇查询:

WITH cte AS (
  SELECT t.*, has_id = CASE WHEN COLUMN_NAME = 'ID' THEN 'true' ELSE 'false' END
  FROM INFORMATION_SCHEMA.TABLES t
  OUTER APPLY (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS c
               WHERE t.TABLE_NAME = c.TABLE_NAME
                 AND t.[TABLE_SCHEMA] = c.[TABLE_SCHEMA]
                 AND c.COLUMN_NAME = 'id') s
  WHERE t.TABLE_SCHEMA IN (...)
)
SELECT 
 query_to_run = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
   'SELECT tab_name      = ''<tab_name>'',
           has_id        = ''<has_id>'',
           id_null_count = <id_null_count>,
           id_not_null_count = <id_not_null_count>
    FROM <schema_name>.<tab_name>'
,'<tab_name>', TABLE_NAME)
,'<schema_name>', TABLE_SCHEMA)
,'<has_id>', has_id)
,'<id_null_count>', CASE WHEN has_id = 'false' THEN '0' ELSE 'SUM(CASE WHEN id IS NULL THEN 1 END)' END)
,'<id_not_null_count>', CASE WHEN has_id = 'false' THEN '0' ELSE 'COUNT(id)' END)
FROM cte;
复制输出并在单独的窗口中执行。可以添加UNION ALL以获得单个结果集


pmbAustin回答了如何列出没有ID列的所有表

为了知道每个表中有多少行,SQLServer为您提供了一个内置的报告

右键单击SSMS中的数据库,单击“报告”、“标准报告”,然后单击“磁盘使用情况表”


现在您知道了每个表中有多少行,并且从pmbAustin的回答可以知道哪些表有ID列,哪些表没有ID列。通过Excel中的一个简单的Vlookup,您可以将这两个数据集结合起来,得到您想要的任何答案。

pmbAustin回答了如何列出所有没有ID列的表

为了知道每个表中有多少行,SQLServer为您提供了一个内置的报告

右键单击SSMS中的数据库,单击“报告”、“标准报告”,然后单击“磁盘使用情况表”


现在您知道了每个表中有多少行,并且从pmbAustin的回答可以知道哪些表有ID列,哪些表没有ID列。使用Excel中的一个简单的Vlookup,您可以将这两个数据集结合起来,得到您想要的任何答案。

我知道,请耐心等待。@LukaszSzozda这是我的解决方案。我想我会更快。。。应得到-1。干杯我想我会更快。。。当之无愧-1-我没有得到你之前的评论。这不是我的反对票。无论如何,+1用于改进答案,加上引用,我将使用QUOTENAME,而不是显式添加[]Hi@LukaszSzozda,我的错误,对不起,我认为是因为评论。谢谢你的支持投票。我知道,请耐心等待。@LukaszSzozda这是我的解决方案。我想我会更快。。。应得到-1。干杯我想我会更快。。。当之无愧-1-我没有得到你之前的评论。这不是我的反对票。无论如何,+1用于改进答案,加上引用,我将使用QUOTENAME,而不是显式添加[]Hi@LukaszSzozda,我的错误,对不起,我认为是因为评论。谢谢你的支持投票。