vst*_*ien 9 t-sql sql-server ssms
使用存储过程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
Run Code Online (Sandbox Code Playgroud)
和
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
Run Code Online (Sandbox Code Playgroud)
当我查看表的属性(在SSMS内)时,该表被标记为系统对象.IsSystemObject虽然(AFAIK)不存在对象属性.
除了对象属性外,如何检查表是否是系统对象?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]
Run Code Online (Sandbox Code Playgroud)
(tbl别名在哪里sys.tables)
如此看来,这是一个组合-无论是is_ms_shipped从sys.tables为1,或具有特定扩展属性集.