应使用sys.sql_modules配合sys.views联查并确保view definition权限,通过n'%string%'在definition字段中搜索,结果需包含schema_name以准确定位视图。

用 sys.sql_modules 查找视图定义中的字符串
SQL Server 不允许直接在 sys.views 中搜索定义文本,因为视图的 SQL 语句实际存放在 sys.sql_modules 里,且只对拥有 VIEW DEFINITION 权限的用户可见。你需要联查 sys.views 和 sys.sql_modules,并用 LIKE 搜索 definition 字段。
常见错误是只查 sys.objects 或漏掉权限校验——没权限时查询会返回空,但不会报错,容易误判为“没找到”。
- 必须确保当前登录用户有目标数据库的
VIEW DEFINITION权限(或属于db_owner、sysadmin) -
sys.sql_modules.definition是nvarchar(max),但LIKE能正常匹配,无需转成varchar - 搜索字符串建议用
N'%your_string%'前缀,避免隐式转换导致中文乱码或匹配失败
执行带 schema 名的精准查询
视图名可能重复(不同 schema),所以结果里必须包含 schema_name 才能准确定位。直接用 OBJECT_SCHEMA_NAME(object_id) 比联查 sys.schemas 更轻量、更可靠。
SELECT OBJECT_SCHEMA_NAME(v.object_id) AS schema_name, v.name AS view_name, m.definition FROM sys.views v INNER JOIN sys.sql_modules m ON v.object_id = m.object_id WHERE m.definition LIKE N'%your_target_string%';
注意:如果目标字符串含通配符(如 % 或 _),需用 ESCAPE 子句处理;若只是普通关键词,不用额外转义。
处理大小写敏感与注释干扰
默认情况下,SQL Server 实例排序规则决定是否区分大小写。如果你的数据库是大小写敏感排序规则(如 Latin1_General_CS_AS),而搜索时不加 COLLATE,可能漏匹配。同时,注释里的字符串也会被扫中,这不是 bug,是预期行为——毕竟注释也是定义的一部分。
- 想忽略大小写?在
LIKE后加COLLATE DATABASE_DEFAULT - 想排除注释行?
sys.sql_modules.definition是完整文本,无法用 SQL 精确剥离注释,得靠应用层后处理 - 性能上,全表扫描
sys.sql_modules在大型数据库中可能稍慢,但通常不到 1 秒——它本身数据量不大
排查“查不到”但实际存在的典型原因
最常踩的坑不是语法写错,而是权限和上下文问题。比如你在 master 数据库里执行查询,却忘了 USE your_db,那所有 sys.* 视图都指向 master,自然找不到用户库里的视图。
- 务必先
USE [your_database_name],或在查询中显式指定数据库前缀(如your_db.sys.views) - 检查是否用了同义词(
synonym)代替视图——同义词不存定义,查不到 - 加密视图(
WITH ENCRYPTION)的definition字段为NULL,这类视图永远搜不到,且无提示
加密视图是真正的盲区——你既看不到定义,也搜不到内容,只能靠文档或部署记录反推。这点很容易被忽略,直到线上出问题才意识到。










