Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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
Sql server 我需要一种方法来查看哪些db表不是空的,但我对语法有点纠结_Sql Server_While Loop - Fatal编程技术网

Sql server 我需要一种方法来查看哪些db表不是空的,但我对语法有点纠结

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

我使用一个引用表,通过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%')

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循环。