Gar*_*del 295 t-sql sql-server stored-procedures sql-server-2008
我需要在SQL Server 2008中搜索包含数据库字段名称或变量名称的存储过程.
Kas*_*hif 530
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%Foo%'
AND ROUTINE_TYPE='PROCEDURE'
Run Code Online (Sandbox Code Playgroud)
SELECT OBJECT_NAME(id)
FROM SYSCOMMENTS
WHERE [text] LIKE '%Foo%'
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
GROUP BY OBJECT_NAME(id)
Run Code Online (Sandbox Code Playgroud)
SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules
WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
AND definition LIKE '%Foo%'
Run Code Online (Sandbox Code Playgroud)
mar*_*c_s 75
抓住自己的免费 Red-Gate SQL搜索工具的副本,开始享受在SQL Server中搜索!:-)
这是一个非常有用的工具,是的!它完全免费,任何用途都是免费的.
Los*_*ear 28
我接受了Kashif的回答并将他们所有人联合起来.奇怪的是,有时候,我在其中一个选择中找到了结果而在另一个选择中找不到结果.所以为了安全起见,我在寻找东西时全部运行3.希望这可以帮助:
DECLARE @SearchText varchar(1000) = 'mytext';
SELECT DISTINCT SPName
FROM (
(SELECT ROUTINE_NAME SPName
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%' + @SearchText + '%'
AND ROUTINE_TYPE='PROCEDURE')
UNION ALL
(SELECT OBJECT_NAME(id) SPName
FROM SYSCOMMENTS
WHERE [text] LIKE '%' + @SearchText + '%'
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
GROUP BY OBJECT_NAME(id))
UNION ALL
(SELECT OBJECT_NAME(object_id) SPName
FROM sys.sql_modules
WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1
AND definition LIKE '%' + @SearchText + '%')
) AS T
ORDER BY T.SPName
Run Code Online (Sandbox Code Playgroud)
Gar*_*del 10
SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%FieldName%'
AND ROUTINE_TYPE='PROCEDURE'
Run Code Online (Sandbox Code Playgroud)
小智 10
如果您还需要架构:
SELECT DISTINCT SCHEMA_NAME(o.schema_id),o.name,[text]
FROM syscomments AS c
INNER JOIN sys.objects AS o ON c.id = o.[object_id]
INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
WHERE text LIKE '%foo%'
ORDER BY SCHEMA_NAME(o.schema_id),o.name
Run Code Online (Sandbox Code Playgroud)
我试过上面的例子,但它没有显示超过4000个字符然后我修改了一点点,并能够获得整个存储过程定义.请参阅下面的更新脚本 -
SELECT SCHEMA_NAME(O.SCHEMA_ID) [SCHEMA_NAME], O.NAME, OBJECT_DEFINITION(OBJECT_ID) TEXT
FROM SYSCOMMENTS AS C
INNER JOIN SYS.OBJECTS AS O ON C.ID = O.[OBJECT_ID]
INNER JOIN SYS.SCHEMAS AS S ON O.SCHEMA_ID = S.SCHEMA_ID
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%FOO%'
ORDER BY SCHEMA_NAME(O.SCHEMA_ID), O.NAME
Run Code Online (Sandbox Code Playgroud)
对于任何高于 SQL Server 2000 的 SQL Server:
SELECT object_name = OBJECT_NAME(sm.object_id), o.type_desc, sm.definition
FROM sys.sql_modules AS sm
JOIN sys.objects AS o ON sm.object_id = o.object_id
WHERE sm.definition like '%searchString%'
ORDER BY o.type, o.name, o.object_id
Run Code Online (Sandbox Code Playgroud)
如果有人被 SQL Server 2000 困住,表 sql_modules 不存在,因此您可以使用 syscomments,您将获得大于 4000 个字符的存储过程的多条记录,但它们将具有相同的c.number字段,以便您可以分组将各个部分组合在一起以获得完整的存储过程文本:
Select o.id, c.number, o.name, c.text
from syscomments c
inner join sysobjects o on o.id = c.id
where c.encrypted = 0 and o.type = 'P'
and c.id in
(Select id from syscomments where text like '%searchtext%')
order by objecttype, o.name, o.id, c.number, c.colid
Run Code Online (Sandbox Code Playgroud)
首先确保您在用户凭据下以及正确的数据库上下文中运行查询.
USE YOUR_DATABASE_NAME;
Run Code Online (Sandbox Code Playgroud)
否则,sys.procedures将不返回任何内容.现在运行查询如下:
select * from sys.procedures p
join sys.syscomments s on p.object_id = s.id
where text like '%YOUR_TEXT%';
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITION,但要注意它只保存例程的有限数量的字符(即前4000个字符).
select * from YOUR_DATABASE_NAME.INFORMATION_SCHEMA.ROUTINES
where ROUTINE_DEFINITION like '%YOUR_TEXT%';
Run Code Online (Sandbox Code Playgroud)
我在Microsoft SQL Server 2008 R2(SP1)上测试 - 10.50.2500.0(X64)