Using the stored procedure sp_msforeachtable it’s possible to execute a script for all tables in a database.
However, there are system tables which I’d like to exclude from that. Instinctively, I would check the properties IsSystemTable or IsMSShipped. These don’t work like I expect – I have for example a table called __RefactorLog:

But when I query if this is a system or MS Shipped table, SQL Server reports none of my tables are system tables:
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
and
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
When I look into the properties of the table (inside SSMS), the table is marked as a system object. An object property like IsSystemObject doesn’t exist though (AFAIK).
How do I check if a table is a system object, apart from the object property? How does SSMS check if a table is a system object?
Management studio 2008 seems to run some quite ugly following code when opening the “System Tables” folder in the object explorer, the key bit seems to be:
(Where
tblis an alias forsys.tables)So it seems that it’s a combination – either
is_ms_shippedfromsys.tablesbeing 1, or having a particular extended property set.