Sql server 查询系统表时如何排除系统表?
我正在运行以下SQL: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
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 Bolam和vmvadivel答案:
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
所以当您尝试排除所有系统表时,它不会受到影响