SQL Server:如何显示存储过程等对象中含指定文本的行?
提取包含特定文本的具体代码行
嗨,我来帮你搞定这个需求!你当前的查询已经能精准定位到包含employee_project的存储过程、函数、触发器和视图,但要拿到具体出现该文本的代码行,可以试试下面的方案,完美兼容你在用的SQL Server 2008 R2和2016版本:
兼容SQL Server 2008 R2的通用方案
因为2008 R2没有内置的字符串拆分函数,我们可以借助XML来实现行拆分:
WITH SplitCodeLines AS ( SELECT so.name AS object_name, so.type_desc AS object_type, -- 处理不同换行格式(CRLF/LF),转换成XML节点后筛选目标行 CAST('<lines><line>' + REPLACE(REPLACE(ssm.definition, CHAR(13), ''), CHAR(10), '</line><line>') + '</line></lines>' AS XML) AS code_xml FROM sys.objects so INNER JOIN sys.sql_modules ssm ON so.object_id = ssm.object_id WHERE ssm.definition LIKE '%employee_project%' ) SELECT object_name, object_type, line.value('.', 'NVARCHAR(MAX)') AS matched_line FROM SplitCodeLines CROSS APPLY code_xml.nodes('/lines/line[contains(text()[1], "employee_project")]') AS lines(line)
SQL Server 2016及以上简化方案
2016开始支持STRING_SPLIT函数,代码会更简洁:
SELECT so.name AS object_name, so.type_desc AS object_type, value AS matched_line FROM sys.objects so INNER JOIN sys.sql_modules ssm ON so.object_id = ssm.object_id -- 拆分代码为行,兼容CRLF和LF格式 CROSS APPLY STRING_SPLIT(REPLACE(ssm.definition, CHAR(13), ''), CHAR(10)) WHERE value LIKE '%employee_project%'
小提示
- 两种方案都会返回包含
employee_project的具体代码行,同时附带对象名称和类型(比如存储过程、视图等),方便你快速定位修改。 - 如果代码里有特殊XML字符(比如
<、>),可以在转换XML前用REPLACE转义,避免报错,比如加上REPLACE(ssm.definition, '&', '&')这类处理。
内容的提问来源于stack exchange,提问作者srh
相关产品推荐
相关产品推荐

