MSSQL:给定一个表的object_id,确定它是否为空

时间:2012-02-17 14:18:15

标签: sql sql-server-2008 reflection introspection

对于一些数据库健全性检查代码,我想确定特定的object_id是否对应于 empty 表。

是否有某种方式(例如)select count(*) from magic_operator(my_object_id)或类似的?

我非常喜欢可以在MS SQL server 2008b上运行的纯SQL解决方案。

2 个答案:

答案 0 :(得分:11)

你可以从

中得到一个粗略的想法
SELECT SUM(rows)
FROM sys.partitions p 
WHERE index_id < 2 and p.object_id=@my_object_id

如果要保证准确性,则需要构造并执行包含两个部分对象名称的动态SQL字符串。下面的示例虽然取决于您使用它的方式,但您可能更喜欢使用sp_executesql并将结果作为输出参数返回。

DECLARE @DynSQL nvarchar(max) = 
            N'SELECT CASE WHEN EXISTS(SELECT * FROM ' + 
            QUOTENAME(OBJECT_SCHEMA_NAME(@my_object_id)) + '.' + 
                   QUOTENAME(OBJECT_NAME(@my_object_id)) +
           ') THEN 0 ELSE 1 END AS IsEmpty'


EXECUTE (@DynSQL)

答案 1 :(得分:3)

那取决于你认为是什么Pure sql 我想出了以下解决方案。它纯粹是用T-SQL编写的,但使用动态构建的查询

-- Using variables just for better readability.
DECLARE @Name NVARCHAR(4000)
DECLARE @Schema NVARCHAR(4000)
DECLARE @Query NVARCHAR(4000)

-- Get the relevant data
SET @Schema = QUOTENAME(OBJECT_SCHEMA_NAME(613577224))
SET @Name = QUOTENAME(OBJECT_NAME(613577224))
-- Build query taking into consideration the schema and possible poor object naming
SET @Query = 'SELECT COUNT(*) FROM ' + @Schema + '.' + @Name + ''
-- execute it.
EXEC(@Query)

修改

更改考虑了评论中描述的可能的错误情况。

我已经概述了变量,因为这对我来说是一种方便的方法。欢呼声。