如何编写查询语句列出含特定数据类型的表(排除视图)
如何修改查询以仅列出包含特定数据类型的表(排除视图)?
嘿,这个问题很常见,我来帮你搞定!要实现只返回表、排除视图的需求,核心就是确保我们的查询只关联存储表对象的系统视图,或者在关联通用对象视图时加上表类型的筛选条件。
先看你给出的当前查询——其实它已经用了sys.tables,而sys.tables本身只存储数据库里的用户表,不会包含视图。如果你之前的脚本确实会返回视图,可能是之前用了sys.objects或者sys.all_objects这类包含所有对象的视图?不管怎样,我给你两种可靠的修改方案:
方案1:基于sys.tables的最简写法(推荐)
这个方案直接利用sys.tables只包含表的特性,不需要额外过滤条件,结果自然排除视图:
SELECT s.name AS 'schema', ts.name AS TableName, c.name AS column_name, c.column_id, SCHEMA_NAME(t.schema_id) AS DatatypeSchema, t.name AS Datatypename, t.is_user_defined, t.is_assembly_type, c.is_nullable, c.max_length, c.PRECISION, c.scale FROM sys.columns AS c INNER JOIN sys.types AS t ON c.user_type_id = t.user_type_id -- 仅关联用户表,自动排除视图 INNER JOIN sys.tables ts ON ts.OBJECT_ID = c.OBJECT_ID INNER JOIN sys.schemas s ON s.schema_id = ts.schema_id -- 如果你要筛选特定数据类型,添加下面的WHERE子句(示例为筛选nvarchar) -- WHERE t.name = 'nvarchar' ORDER BY s.name, ts.name, c.column_id
方案2:如果之前用的是sys.objects,添加类型筛选
如果你原来的脚本是关联sys.objects(这个视图包含表、视图、存储过程等所有对象),只需要加一个WHERE条件筛选表类型(用户表的类型标识是'U',视图是'V'):
SELECT s.name AS 'schema', o.name AS TableName, c.name AS column_name, c.column_id, SCHEMA_NAME(t.schema_id) AS DatatypeSchema, t.name AS Datatypename, t.is_user_defined, t.is_assembly_type, c.is_nullable, c.max_length, c.PRECISION, c.scale FROM sys.columns AS c INNER JOIN sys.types AS t ON c.user_type_id = t.user_type_id INNER JOIN sys.objects o ON o.OBJECT_ID = c.OBJECT_ID INNER JOIN sys.schemas s ON s.schema_id = o.schema_id -- 关键:筛选仅用户表,排除视图及其他对象 WHERE o.type = 'U' -- 同样可以添加特定数据类型的筛选 -- AND t.name = '你的目标数据类型' ORDER BY s.name, o.name, c.column_id
小提示
- 如果你需要找的是自定义数据类型,可以结合
t.is_user_defined = 1来进一步筛选。 - 记得替换
WHERE子句里的类型名,改成你要找的特定数据类型(比如int、datetime2或者自定义类型的名称)。
内容的提问来源于stack exchange,提问作者Don
相关产品推荐
相关产品推荐

