【问题标题】:MSSQL: given a table's object_id, determine whether it is emptyMSSQL:给定一个表的object_id,判断它是否为空
【发布时间】:2012-02-17 14:18:14
【问题描述】:

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

有什么方法可以(例如)select count(*) from magic_operator(my_object_id) 或类似的吗?

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

【问题讨论】:

    标签: sql sql-server-2008 reflection introspection


    【解决方案1】:

    你可以从中得到一个粗略的想法

    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)
    

    【讨论】:

    • 无论如何我都会使用sp_executesql。还有两个选项 +1 以及使用 EXISTS 而不是 COUNT(*)...
    • 哇——第一个解决方案是如何工作的?您正在查看某种索引中的行数 - 所以,我猜测任何特定文件组中的行,或者......?为什么会不准确?它看起来比第二个更简单,所以如果它足够好的话;这就是我要使用的 - 谢谢!
    • @EamonNerbonne - 不能保证 100% 准确。它包括未提交事务的影响,can be manually updated,有时可能会不同步,需要用DBCC UPDATEUSAGE 修复(不确定具体时间)
    • 啊,是的,你对串联是正确的,我超前了。出于一致性和其他原因,我仍然更喜欢sp_executesql - sqlblog.com/blogs/aaron_bertrand/archive/2011/09/17/…
    • 谢谢,这就像一个魅力!作为阅读此答案的其他人的详细信息; index_id msdn.microsoft.com/en-us/library/ms189051.aspx ex
    【解决方案2】:

    这取决于你认为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)
    

    编辑

    这些更改考虑了 cmets 中描述的可能的错误情况。

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

    【讨论】:

    • 为什么不只是SET @Query = 'SELECT COUNT(*) FROM ' + OBJECT_NAME(@my_object_id) + ';'?临时@Name 变量给你带来了什么?另外,如果架构不是dbo(或当前用户的默认架构)怎么办?在这种情况下包含OBJECT_SCHEMA_NAME 也很有用。最后,如果表的名称选择不当,例如my tablemy-table,该怎么办?用QUOTENAME 括起对对象的引用很有用。
    • 纯 sql 我的意思是自包含的;不需要一些外部脚本引擎:-) - 动态生成的 sql 很好,只要它是安全的。
    • @AaronBertrand @Name 变量没有任何意义。这里的重点是显示查询的可能性。
    • 您应该使用QUOTENAME 而不是自己连接方括号,这样代码才能正确处理包含] 字符的对象名称。
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2019-03-20
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2012-03-15
    • 2014-07-18
    相关资源
    最近更新 更多