Sql server 我需要一种方法来查看哪些db表不是空的,但我对语法有点纠结
我使用一个引用表,通过schemaid引用模式表名。 我需要从t表中运行SELECT count,其中count>0 但仅适用于名称中包含CORE:Table的表。我认为可以通过声明@schemaset,然后使用while循环来处理它来替换表。我更习惯于FOR循环,但MSSQL似乎没有Sql server 我需要一种方法来查看哪些db表不是空的,但我对语法有点纠结,sql-server,while-loop,Sql Server,While Loop,我使用一个引用表,通过schemaid引用模式表名。 我需要从t表中运行SELECT count,其中count>0 但仅适用于名称中包含CORE:Table的表。我认为可以通过声明@schemaset,然后使用while循环来处理它来替换表。我更习惯于FOR循环,但MSSQL似乎没有 DECLARE @schemaset VARCHAR WHILE @schemaset in (select schemaId from arschema where name like 'CORE:Table
DECLARE @schemaset VARCHAR
WHILE @schemaset in (select schemaId from arschema where name like 'CORE:Table%')
BEGIN
select COUNT(*) from T(@schemaset)where FIELD1 IS NOT NULL
END
查询运行,但表示已成功完成。我试图打印以查看结果,但结果显示有错误
那么,如何在一组特定的表上获得完整/空检查 下面是返回所有空表的SQL示例:
-- All Empty Tables
CREATE TABLE #counts (table_name sysname,row_count int)
EXEC sp_MSForEachTable @command1='INSERT #counts (table_name, row_count) SELECT ''?'', COUNT(*) FROM ?'
SELECT table_name AS EmptyTables, row_count
FROM #counts
WHERE row_count = 0
ORDER BY table_name
DROP TABLE #counts
GO
另一种策略不依赖于未记录的spmsforeachtable存储过程,它允许您筛选要检查的表,如下所示:
DECLARE @sql nvarchar(max);
CREATE TABLE #Counts (Table_Name sysname, Row_Count int);
SET @sql = N'';
SELECT @sql += N'INSERT INTO #Counts (Table_Name, Row_Count) SELECT ''' + TABLE_NAME +
N''', COUNT(1) FROM ' + QUOTENAME(TABLE_NAME) + N'; '
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA = 'dbo' AND TABLE_NAME LIKE N'A%'
PRINT @sql;
EXEC(@sql);
SELECT * FROM #Counts
DROP TABLE #Counts
SELECT语句仅将表列表筛选为“dbo”架构中的表,以及以字母“A”开头的表。您可以根据自己的需要对其进行更改,筛选出您想要的任何表
基本上,这段代码所做的是为每个表构建一系列INSERT语句,将计数和表名插入到临时表中。你可以按摩这个做任何你想做的事情。。。这纯粹是一个例子。您不需要循环或动态sql。这将使用一条select语句返回所有具有零行的表
SELECT TableName = t.name
, TableRowCount = SUM(p.rows)
, SchemaName = s.name
FROM sys.partitions AS p
INNER JOIN sys.tables AS t ON p.object_id = t.object_id
INNER JOIN sys.schemas AS s ON t.schema_id = s.schema_id
WHERE p.index_id IN (0, 1) -- heap or clustered index
group by t.name
, s.name
having SUM(p.rows) = 0
order by t.name
您需要使用动态SQL。如果相同的表名在两个不同的架构中,可能还需要按对象id分组,或者可能需要包含架构名。-编辑-添加架构名,以防在不同架构中有多个同名的对象。感谢@SqlZim的建议。这个解决方案也有效,谢谢你。但是,我还需要包括schemaid和name映射的schema表中的名称。这就是为什么我需要while循环,它允许我用表名的前3个字符限定查询。。。只需更改SELECT语句中的FROM和WHERE即可满足您的需要。您仍然不需要任何WHILE循环。