Sql server 查询系统表时如何排除系统表?

Sql server 查询系统表时如何排除系统表?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我正在运行以下SQL: SELECT S.name as Owner, T.name as TableName FROM sys.tables AS T JOIN sys.schemas AS S ON S.schema_id = T.schema_id 结果是: Owner TableName ------------------------ dbo Person dbo Customer dbo sysdiagrams sysdiag

我正在运行以下SQL:

SELECT S.name as Owner, T.name as TableName FROM  sys.tables AS T
JOIN sys.schemas AS S ON S.schema_id = T.schema_id
结果是:

Owner   TableName
------------------------
dbo         Person
dbo         Customer
dbo         sysdiagrams
sysdiagrams
是一个
系统表
,但显示在结果中

更新: 感谢大家的回答和评论,我使用的是Nate Bolamvmvadivel答案:

SELECT S.name as Owner, T.name as TableName 
FROM  
  sys.tables AS T
    INNER JOIN sys.schemas AS S ON S.schema_id = T.schema_id
    LEFT JOIN sys.extended_properties AS EP ON EP.major_id = T.[object_id]
WHERE 
  T.is_ms_shipped = 0 AND 
  (EP.class_desc IS NULL OR (EP.class_desc <>'OBJECT_OR_COLUMN' AND 
  EP.[name] <> 'microsoft_database_tools_support'))
选择S.name作为所有者,选择T.name作为表名
从…起
sys.tables AS T
将sys.schema作为S在S.schema_id=T.schema_id上的内部联接
将sys.extended_属性作为EP在EP.major_id=T上的EP左连接。[对象_id]
哪里
T.is_ms_装运=0和
(EP.class_desc为空或(EP.class_desc“对象”或“列”和
EP.[name]“microsoft\u数据库\u工具\u支持”))

请尝试下面的查询,谢谢

SELECT S.name as Owner, T.name as TableName FROM  sys.tables AS T
JOIN sys.schemas AS S ON S.schema_id = T.schema_id
WHERE T.name <> 'sysdiagrams'
从sys.tables as T中选择S.name作为所有者,T.name作为TableName
将sys.schema作为S连接到S.schema_id=T.schema_id
其中T.name'sysdiagrams'

SSMS使用扩展属性将sysdiagrams表标记为一种伪系统表

试试这个:

SELECT S.name as Owner, T.name as TableName FROM  sys.tables AS T
INNER JOIN sys.schemas AS S ON S.schema_id = T.schema_id
LEFT JOIN sys.extended_properties AS EP ON EP.major_id = T.[object_id]
WHERE (EP.class_desc IS NULL 
OR (EP.class_desc <> 'OBJECT_OR_COLUMN'
    AND EP.[name] <> 'microsoft_database_tools_support'))
从sys.tables as T中选择S.name作为所有者,T.name作为TableName
将sys.schema作为S在S.schema_id=T.schema_id上的内部联接
将sys.extended_属性作为EP在EP.major_id=T上的EP左连接。[对象_id]
其中(EP.class_desc)为空
或(EP.class_desc'对象或列'
和EP。[name]“microsoft\u数据库\u工具\u支持”))

您可以利用
已装运的
进行此操作。希望下面的脚本是你正在寻找的

SELECT 
    S.[name] AS Owner, 
    T.[name] AS TableName 
FROM  
    sys.tables AS T JOIN sys.schemas AS S 
    ON S.schema_id = T.schema_id
WHERE 
    T.is_ms_shipped = 0 
    AND T.[name] <> 'sysdiagrams'
选择
S.[名称]作为所有者,
T.[name]作为表名
从…起
sys.tables作为T将sys.schema作为S连接
在S.schema_id=T.schema_id上
哪里
T.是否已装运=0
和T.[name]“系统图”

谢谢您的回答,我相信这将只排除
系统图
表,但我想知道是否有排除所有系统表的通用方法。通常,在每个创建的数据库中只有一个名为
系统图
的系统表,因此我们可以进行上述查询,感谢您的时间。欢迎使用StackOverflow:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮(
{}
),以很好地格式化和语法突出显示它!当然可以。感谢您让我了解“代码示例”按钮。不幸的是,这并不排除
系统图
表,因为该表未设置
is_ms_shipped
标志……我已编辑了我的答案以明确忽略系统图。谢谢。
T.[Type]='U'
似乎有点多余,因为
sys.tables
已经只选择了
o.Type='U'
类型的对象。在其定义中删除了冗余的T.[Type]='U'
是\U MS\U发布的
可能是一个更好的属性,如果您还想排除例如添加到数据库以支持复制的对象(而选择的答案仅适用于排除添加到支持图表的对象)@Damien_the_unsiver:不幸的是,
sysdiagrams
表没有设置
is\u ms\u shipped=1
所以当您尝试排除所有系统表时,它不会受到影响