使用存储过程 sp_msforeachtable
可以对数据库中的所有表执行脚本。
但是,我想要排除一些系统表。直觉上,我会检查属性 IsSystemTable
或 IsMSShipped
,但这些属性并不像我期望的那样工作——例如,我有一个名为 __RefactorLog
的表:
但当我查询这是否为系统或 MS Shipped 表时,SQL Server 报告没有我的表是系统表:
exec (N'EXEC Database..sp_msforeachtable "PRINT ''? = '' + CAST(ObjectProperty(Object_ID(''?''), ''IsSystemTable'') AS VARCHAR(MAX))"') AS LOGIN = 'MyETLUser'
-- Results of IsSystemTable:
[dbo].[__RefactorLog] = 0
[schema].[myUserTable] = 0
并且
exec (N'EXEC Database..sp_msforeachtable "PRINT ''? = '' + CAST(ObjectProperty(Object_ID(''?''), ''IsMSShipped'') AS VARCHAR(MAX))"') AS LOGIN = 'MyETLUser'
-- Results of IsMSShipped:
[dbo].[__RefactorLog] = 0
[schema].[myUserTable] = 0
当我查看表的属性(在SSMS内部)时,该表被标记为系统对象。然而像IsSystemObject
这样的对象属性并不存在(据我所知)。
除了对象属性之外,我如何检查一个表是否为系统对象?SSMS如何检查表是否为系统对象?