对于一些数据库健全性检查代码,我想确定特定的object_id是否对应于 empty 表。
是否有某种方式(例如)select count(*) from magic_operator(my_object_id)
或类似的?
我非常喜欢可以在MS SQL server 2008b上运行的纯SQL解决方案。
答案 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)
修改
更改考虑了评论中描述的可能的错误情况。
我已经概述了变量,因为这对我来说是一种方便的方法。欢呼声。