<text> içeren bir saklı yordamı nasıl bulabilirim?


Yanıtlar:


557
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%'

61
Uzun bir prosedürünüz olması durumunda routine_definition'ın 4000 karakterde kırpıldığını unutmayın. Bunun yerine OBJECTPROPERTY yöntemini kullanın.
PeteT

1
Uygulama planına göre, üçüncü varyasyon bu verilere ulaşmanın en etkili yolu gibi görünmektedir.
TMcManemy

1
@PeteT'in söylediklerinden milyonlarca kez. Bu 4000 karakter limiti birkaç yıl önce beni gerçekten ısırdı.
Vivian River

14
3 sorgunun her birinin ne yaptığına ve aralarındaki farkın ne olduğuna dair biraz açıklama ekleyebilir misiniz?
Tot Zam

3
Her bir sorgunun ne yaptığı ve nasıl farklı oldukları veya neden diğerinden daha iyi olduğu hakkında bazı ayrıntılara sahip olmak güzel olurdu. Bu tür yanıtlar, daha az deneyimli mühendisler tarafından kör / kopyala yapıştırmayı ve SQL Server gibi yeni bir RDBMS ile çalışan daha üst düzey mühendisler için hayal kırıklığını teşvik eder.
DavidScherer

78

Kendinize ücretsiz Red-Gate SQL Search aracının bir kopyasını alın ve SQL Server'da arama yapmanın tadını çıkarın! :-)

resim açıklamasını buraya girin

Harika ve çok kullanışlı bir araç ve EVET! her türlü kullanım için tamamen, tamamen ÜCRETSİZDİR.


5
Bu, bu soruya gelmeden önce kullanmakta olduğum mükemmel bir araçtır. Arama sonuçlarını varsayılan olarak 150 ile sınırladığını belirtmek gerekir. Bu sınırı nasıl artıracağınızla ilgili bilgi için bu forum gönderisine göz atın .
Scott

1
Süper hızlı ve kullanışlı bir araçtır.
Suat Atan Doktora

Sınırlı özellikler ama harika bir araç.
Aishwarya Shiva


32

Keşif'in cevabını aldım ve hepsini bir araya getirdim. Garip bir şekilde, bazen seçimlerden birinde sonuçlar buldum, diğerinde değil. Güvende olmak için, bir şey ararken 3'ün tamamını da çalıştırıyorum. Bu yardımcı olur umarım:

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

12

Şemaya da ihtiyacınız varsa:

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 

10
SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%FieldName%' 
AND ROUTINE_TYPE='PROCEDURE'

2
Bununla birlikte, sadece bir alt dize eşleşmesi olduğundan buna dikkat edin . "FieldName" bir yorumda, bir dize sabitinde veya bunun gibi herhangi bir şeyde ortaya çıkabilir. Ayrıca, [whatever]yakalayacağınızdan şüphe duyuyorum whatever(şema niteli tanımlayıcılar ararken daha önemli hale gelir).
CVn

2
Yukarıdaki kabul edilen cevapta @ PeteT'nin yorumuna bakın. BİLGİ_SCHEMA.ROUTINES.ROUTINE_DEFINITION 4000 karakterde kırpılır. Bu nedenle, 4000 karakterden daha uzun yordamlar sakladıysanız bu yöntem çalışmaz.
TMcManemy

7

Yukarıdaki örneği denedim ama 4000'den fazla karakter göstermiyordu, sonra biraz değiştirdim ve tüm saklı yordam tanımını alabildim. Lütfen aşağıdaki güncellenmiş komut dosyasına bakın -

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

6

Öncelikle sorguyu kullanıcı kimlik bilgileriniz altında ve ayrıca doğru veritabanı bağlamında çalıştırdığınızdan emin olun.

USE YOUR_DATABASE_NAME;

Aksi takdirde, sys.procedures hiçbir şey döndürmez. Şimdi sorguyu aşağıdaki gibi çalıştırın:

select * from sys.procedures p 
join sys.syscomments s on p.object_id = s.id 
where text like '%YOUR_TEXT%';

Başka bir seçenek, BİLGİ_SCHEMA.ROUTINES.ROUTINE_DEFINITION kullanmaktır, ancak rutinin yalnızca sınırlı sayıda karakterini (yani ilk 4000 karakter) içerdiğini unutmayın.

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) üzerinde test yaptım



2

İşte Losbear kullanılan birleşim sürümü, ancak aynı zamanda şema adını da çıkaracak şekilde değiştirildi:

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


2

SQL Server 2000'den daha yeni herhangi bir SQL sunucusu için:

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

Birisi SQL Server 2000 ile sıkışmışsa, sql_modules tablosu mevcut değildir, bu nedenle syscomments kullanırsınız, 4000 karakterden daha büyük saklanan proddedures için birden fazla kayıt alırsınız, ancak gruplandırabilmeniz için aynı c.number alanına sahip olurlar. saklanan yordam metninin tamamını almak için parçaları bir araya getirin:

    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        


1
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

0
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

Bu sorgu, saklı yordam içinde "XXXX" başvurulan herhangi bir saklı yordamın adını ve içeriğini döndürür.

Belirli bir tabloya / görünüme / prosedüre gönderme yapan prosedürler bulunurken bu durumdan çıkılır.


0
SELECT * FROM sys.procedures WHERE Name LIKE '%CompanySpecialisation%'

SQL Company'de "CompanySpecialisation" gibi adların bulunduğu tüm saklı yordamları seçmek için yazdığım şey budur


0

SP'de metin bulmak için Saklı Yordam. {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

0
SELECT OBJECT_NAME(id)     
FROM syscomments 
WHERE [text] LIKE '%Name%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
GROUP BY OBJECT_NAME(id)

Bunu dene .....


0
sp_msforeachdb 'use ?;select name,''?'' from sys.procedures where object_definition(object_id) like ''%text%'''

Bu, tüm veritabanlarının tüm saklı yordamlarını arayacaktır. Bu aynı zamanda uzun prosedürler için de işe yarayacaktır.


0

Bu komut dosyasını kullanıyorum. XML Yorumlarınızı sarı bir arka planda siyah metin olarak görüntülenecek şekilde değiştirirseniz, aradığınız metni sonuçların xml sütununda vurgulama etkisi elde edersiniz. (Araçlar -> Seçenekler -> Çevre -> Yazı Tipleri ve Renkler [Görüntüleme öğeleri: XML Açıklaması]

    ---------------------------------------------
    --------------   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     -----------------
    ---------------------------------------------
    ---------------------------------------------
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.