使用存储过程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内)时,该表被标记为系统对象.但是(AFAIK)不存在像IsSystemObject这样的对象属性.
除了对象属性外,如何检查表是否是系统对象? SSMS如何检查表是否是系统对象?
解决方法
在对象资源管理器中打开“系统表”文件夹时,管理工作室2008似乎运行了一些非常难看的代码,关键位似乎是:
CAST( case when tbl.is_ms_shipped = 1 then 1 when ( select major_id from sys.extended_properties where major_id = tbl.object_id and minor_id = 0 and class = 1 and name = N''microsoft_database_tools_support'') is not null then 1 else 0 end AS bit) AS [IsSystemObject]
(其中tbl是sys.tables的别名)
所以它似乎是一个组合 – 从sys.tables的is_ms_shipped为1,或者具有特定的扩展属性集.