ms sql server如何检查表是否有“id”列,如果有“id”,如何计数行
我的SQL Server数据库中的表太多。其中大多数都有“id”列,但有些没有。我想知道哪些表没有“id”列,如果存在“id”列,我想统计id=null的行。查询结果可能如下所示: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 如何编写此查询?
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,我的错误,对不起,我认为是因为评论。谢谢你的支持投票。