使用存储过程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
但是不存在类似的对象属性(AFAIK)。
除了对象属性之外,如何检查表是否是系统对象?SSMS 如何检查表是否为系统对象?