20 ответов:
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%Foo%' AND ROUTINE_TYPE='PROCEDURE'
SELECT OBJECT_NAME(id) FROM SYSCOMMENTS WHERE [text] LIKE '%Foo%' AND OBJECTPROPERTY(id, 'IsProcedure') = 1 GROUP BY OBJECT_NAME(id)
SELECT OBJECT_NAME(object_id) FROM sys.sql_modules WHERE OBJECTPROPERTY(object_id, 'IsProcedure') = 1 AND definition LIKE '%Foo%'
возьмите себе копию свободныйRed-Gate SQL Search инструмент и начать наслаждаться поиском в SQL Server! : -)
Это отличный и очень полезный инструмент, и да! это полностью, абсолютно бесплатно для любого вида использования.
вы также можете попробовать ApexSQL Search - бесплатный SSMS плагин от ApexSQL.
Я взял ответ Кашифа и объединил их всех вместе. Как ни странно, иногда я находил результаты в одном из вариантов, но не в другом. Поэтому, чтобы быть в безопасности, я запускаю все 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
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%FieldName%' AND ROUTINE_TYPE='PROCEDURE'
в случае, если вам нужна схема, а также:
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
я попробовал пример выше, но он не показывал более 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
сначала убедитесь, что вы выполняете запрос под своими учетными данными пользователя, а также в правильном контексте базы данных.
USE YOUR_DATABASE_NAME;В противном случае, sys.процедуры ничего не вернут. Теперь запустите запрос, как показано ниже:
select * from sys.procedures p join sys.syscomments s on p.object_id = s.id where text like '%YOUR_TEXT%';другой вариант-использовать INFORMATION_SCHEMA.ЗАВЕДЕННЫЙ ПОРЯДОК.ROUTINE_DEFINITION, но имейте в виду, что он содержит только ограниченное количество символов (т. е. первые 4000 символов) процедуры.
select * from YOUR_DATABASE_NAME.INFORMATION_SCHEMA.ROUTINES where ROUTINE_DEFINITION like '%YOUR_TEXT%';Я тестировал на Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)
для любого SQL server новее SQL server 2000:
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Если кто-то застрял с SQL server 2000, таблица sql_modules не существует, поэтому вы будете использовать syscomments, вы получите несколько записей для сохраненных procdedures размером более 4000 символов, но они будут иметь то же самое Си.количество поле, так что вы можете сгруппировать части вместе, чтобы получить полный текст хранимой процедуры:
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вы также можете попробовать программа I написал, что более эффективно использовать быстрый инструмент, чем писать SQL-запрос. Он также будет искать файлы исходного кода.
create Procedure [dbo].[TextFinder] (@Text varchar(500),@Type varchar(2)=NULL) AS BEGIN SELECT DISTINCT o.name AS ObjectName, CASE o.xtype WHEN 'C' THEN 'CHECK constraint' WHEN 'D' THEN 'Default or DEFAULT constraint' WHEN 'F' THEN 'FOREIGN KEY constraint' WHEN 'FN' THEN 'Scalar function' WHEN 'IF' THEN 'In-lined table-function' WHEN 'K' THEN 'PRIMARY KEY or UNIQUE constraint' WHEN 'L' THEN 'Log' WHEN 'P' THEN 'Stored procedure' WHEN 'R' THEN 'Rule' WHEN 'RF' THEN 'Replication filter stored procedure' WHEN 'S' THEN 'System table' WHEN 'TF' THEN 'Table function' WHEN 'TR' THEN 'Trigger'`enter code here` WHEN 'U' THEN 'User table' WHEN 'V' THEN 'View' WHEN 'X' THEN 'Extended stored procedure' ELSE o.xtype END AS ObjectType, ISNULL( p.Name, '[db]') AS Location FROM syscomments c INNER JOIN sysobjects o ON c.id=o.id LEFT JOIN sysobjects p ON o.Parent_obj=p.id WHERE c.text LIKE '%' + @Text + '%' and o.xtype = case when @Type IS NULL then o.xtype else @Type end ORDER BY Location, ObjectName END
Как найти хранимую процедуру, содержащую текст или строку
много раз нам нужно найти текст или строку в хранимой процедуре. Вот запрос, чтобы найти содержащий текст.
SELECT OBJECT_NAME(id) FROM SYSCOMMENTS WHERE [text] LIKE '%Text%' AND OBJECTPROPERTY(id, 'IsProcedure') = 1 GROUP BY OBJECT_NAME(id)для получения дополнительной информации, пожалуйста, проверьте данный URL, приведенный ниже.
http://www.freshcodehub.com/Article/34/how-to-find-a-stored-procedure-containing-text-or-string
SELECT s.name + '.' + o.name ProcedureName , c.text ProcedureSteps FROM sys.syscomments c INNER JOIN sys.objects o ON c.id = o.object_id INNER JOIN sys.schemas s ON o.schema_id = s.schema_id WHERE o.type = 'P' AND c.text LIKE N'%XXXX%' ORDER BY s.name + '.' + o.name , c.colidэтот запрос возвращает имя и содержимое любой хранимой процедуры, на которую ссылается" XXXX " в хранимой процедуре.
это выход полезно при поиске процедур, которые ссылаются на определенную таблицу / представление / процедуру
SELECT * FROM sys.procedures WHERE Name LIKE '%CompanySpecialisation%'Это то, что я написал в SQL 2012, чтобы выбрать все хранимые процедуры, где имя, как "CompanySpecialisation"
хранимая процедура для поиска текста в SP.. {Dinesh Baskaran} Trendy Global Systems pvt ltd
create Procedure [dbo].[TextFinder] (@Text varchar(500),@Type varchar(2)=NULL) AS BEGIN SELECT DISTINCT o.name AS ObjectName, CASE o.xtype WHEN 'C' THEN 'CHECK constraint ' WHEN 'D' THEN 'Default or DEFAULT constraint' WHEN 'F' THEN 'FOREIGN KEY constraint' WHEN 'FN' THEN 'Scalar function' WHEN 'IF' THEN 'In-lined table-function' WHEN 'K' THEN 'PRIMARY KEY or UNIQUE constraint' WHEN 'L' THEN 'Log' WHEN 'P' THEN 'Stored procedure' WHEN 'R' THEN 'Rule' WHEN 'RF' THEN 'Replication filter stored procedure' WHEN 'S' THEN 'System table' WHEN 'TF' THEN 'Table function' WHEN 'TR' THEN 'Trigger' WHEN 'U' THEN 'User table' WHEN 'V' THEN 'View' WHEN 'X' THEN 'Extended stored procedure' ELSE o.xtype END AS ObjectType, ISNULL( p.Name, '[db]') AS Location FROM syscomments c INNER JOIN sysobjects o ON c.id=o.id LEFT JOIN sysobjects p ON o.Parent_obj=p.id WHERE c.text LIKE '%' + @Text + '%' and o.xtype = case when @Type IS NULL then o.xtype else @Type end ORDER BY Location, ObjectName END
SELECT OBJECT_NAME(id) FROM syscomments WHERE [text] LIKE '%Name%' AND OBJECTPROPERTY(id, 'IsProcedure') = 1 GROUP BY OBJECT_NAME(id)Попробуйте Это .....
sp_msforeachdb 'use ?;select name,''?'' from sys.procedures where object_definition(object_id) like ''%text%'''это будет искать во всех хранимых процедурах всех баз данных. Это также будет работать для длительных процедур.
Я использую этот скрипт. Если вы измените свои комментарии XML для отображения в виде черного текста на желтом фоне, вы получите эффект выделения текста, который вы ищете в столбце xml результатов. (Tools - > Options - > Environment - > Fonts and Colors [Display items: XML Comment]
--------------------------------------------- -------------- Start FINDTEXT ---------- --------------------------------------------- SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SET NOCOUNT ON GO DECLARE @SearchString VARCHAR(MAX) SET @SearchString = 'the text you''re looking for' DECLARE @OverrideSearchStringWith VARCHAR(MAX) --############################################################################# -- Use Escape chars in Brackets [] like [%] to find percent char. --############################################################################# DECLARE @ReturnLen INT SET @ReturnLen = 50; with lastrun as (select DEPS.OBJECT_ID ,MAX(last_execution_time) as LastRun from sys.dm_exec_procedure_stats DEPS group by deps.object_id ) SELECT OL.Type ,OBJECT_NAME(OL.Obj_ID) AS 'Name' ,LTRIM(RTRIM(REPLACE(SUBSTRING(REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), ''), CHARINDEX(@SearchString, OBJECT_DEFINITION(OL.Obj_ID)) - @ReturnLen, @ReturnLen * 2), @SearchString, ' ***-->>' + @SearchString + '<<--*** '))) AS SourceLine ,CAST(REPLACE(REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(MAX), REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), '')), '&', '(A M P)'), '<', '(L T)'), '>', '(G T)'), @SearchString, '<!-->' + @SearchString + '<-->') AS XML) AS 'Hilight Search' ,(SELECT [processing-instruction(A)] = REPLACE(OBJECT_DEFINITION(OL.Obj_ID), NCHAR(0x001F), '') FOR XML PATH('') ,TYPE ) AS 'code' ,Modded AS Modified ,LastRun as LastRun FROM (SELECT CASE P.type WHEN 'P' THEN 'Proc' WHEN 'V' THEN 'View' WHEN 'TR' THEN 'Trig' ELSE 'Func' END AS 'Type' ,P.OBJECT_ID AS OBJ_id ,P.modify_Date AS modded ,LastRun.LastRun FROM sys.Objects P WITH (NOLOCK) LEFT join lastrun on P.object_id = lastrun.object_id WHERE OBJECT_DEFINITION(p.OBJECT_ID) LIKE '%' + @SearchString + '%' AND type IN ('P', 'V', 'TR', 'FN', 'IF', 'TF') -- AND lastrun.LastRun IS NOT null ) OL OPTION (FAST 10) --------------------------------------------- ---------------- END ----------------- --------------------------------------------- ---------------------------------------------
вот версия объединения, которая использует Losbear made, но модифицирована так, что она также выводит имя схемы:
DECLARE @SearchText varchar(1000) = 'searchtext'; SELECT DISTINCT sc.SPECIFIC_SCHEMA as 'Schema', sp.SPName as 'Name' 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 sp CROSS APPLY (select SPECIFIC_SCHEMA from INFORMATION_SCHEMA.ROUTINES r where r.ROUTINE_NAME = sp.SPName) sc ORDER BY 1


Comments