Jak znaleźć procedurę składowaną zawierającą <tekst>?


Odpowiedzi:


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
Pamiętaj, że definicja rutyny jest przycinana do 4000 znaków na wypadek, gdybyś miał długą procedurę. Zamiast tego użyj metody OBJECTPROPERTY.
PeteT,

1
Zgodnie z planem wykonania trzecia odmiana wydaje się być najbardziej wydajnym sposobem uzyskania tych danych.
TMcManemy 28.01.2013

1
Milion razy więcej niż powiedział @PeteT. Ten limit 4000 znaków naprawdę mnie ugryzł kilka lat temu.
Vivian River

14
Czy możesz dodać wyjaśnienie, co robi każde z 3 zapytań i jaka jest między nimi różnica?
Tot Zam

3
Byłoby miło mieć kilka szczegółów na temat tego, co robi każde zapytanie i jak się różnią i dlaczego jedno jest lepsze od drugiego. Tego rodzaju odpowiedzi zachęcają mniej doświadczonych inżynierów do wklejania / ukrywania oraz frustrację dla starszych inżynierów pracujących z nowym RDBMS, takim jak SQL Server.
DavidScherer,

78

Zdobądź kopię darmowego narzędzia Red-Gate SQL Search i rozpocznij wyszukiwanie w SQL Server! :-)

wprowadź opis zdjęcia tutaj

To świetne i bardzo przydatne narzędzie, i TAK! jest całkowicie, absolutnie BEZPŁATNY dla dowolnego zastosowania.


5
To doskonałe narzędzie, z którego korzystałem już przed tym pytaniem. Warto zauważyć, że domyślnie ogranicza wyniki wyszukiwania do 150. Sprawdź ten post na forum, aby dowiedzieć się, jak zwiększyć ten limit.
Scott

1
Jest to super szybkie i użyteczne narzędzie.
Suat Atan PhD

Ograniczone funkcje, ale niesamowite narzędzie.
Aishwarya Shiva


32

Wziąłem odpowiedź Kashifa i złączyłem je wszystkie razem. Co dziwne, czasami znajdowałem wyniki w jednym z wybranych, ale nie w drugim. Aby być bezpiecznym, prowadzę wszystkie 3, gdy czegoś szukam. Mam nadzieję że to pomoże:

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

Jeśli potrzebujesz również schematu:

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
Uważaj jednak na to, ponieważ jest to tylko dopasowanie podłańcuchowe. „FieldName” może występować w komentarzu lub stałej ciągu znaków, lub coś w tym rodzaju. Ponadto wątpię, czy szukanie [whatever]złapie whatever(staje się ważniejsze, gdy szukasz identyfikatorów kwalifikowanych do schematu).
CVn

2
Zobacz komentarz @ PeteT w zaakceptowanej odpowiedzi powyżej. INFORMACJE_SCHEMA.ROUTINES.ROUTINE_DEFINITION jest przycinany do 4000 znaków. W związku z tym ta metoda nie będzie działać, jeśli procedury składowane są dłuższe niż 4000 znaków.
TMcManemy 28.01.2013

7

Próbowałem powyżej powyższego przykładu, ale nie wyświetlał więcej niż 4000 znaków, a następnie nieco go zmodyfikowałem i byłem w stanie uzyskać całą definicję procedury składowanej. Zobacz zaktualizowany skrypt poniżej -

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

Najpierw upewnij się, że zapytanie jest uruchamiane przy użyciu poświadczeń użytkownika, a także w odpowiednim kontekście bazy danych.

USE YOUR_DATABASE_NAME;

W przeciwnym razie sys.procedures nic nie zwróci. Teraz uruchom zapytanie jak poniżej:

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

Inną opcją jest użycie INFORMACJE_SCHEMA.ROUTINES.ROUTINE_DEFINITION, ale należy pamiętać, że zawiera ona tylko ograniczoną liczbę znaków (tj. Pierwsze 4000 znaków) procedury.

select * from YOUR_DATABASE_NAME.INFORMATION_SCHEMA.ROUTINES
where ROUTINE_DEFINITION like '%YOUR_TEXT%';

Testowałem na Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)



2

Oto wersja unii, która korzysta z Losbear, ale zmodyfikowana tak, aby wyświetlała także nazwę schematu:

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

Jak znaleźć procedurę przechowywaną zawierającą tekst lub ciąg

Wiele razy musimy znaleźć tekst lub ciąg znaków w procedurze przechowywanej. Oto zapytanie, aby znaleźć zawierający tekst.

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

Aby uzyskać więcej informacji, sprawdź podany poniżej adres URL.

http://www.freshcodehub.com/Article/34/how-to-find-a-stored-procedure-containing-text-or-string


2

W przypadku dowolnego serwera SQL nowszego niż 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

Jeśli ktoś utknie w programie SQL Server 2000, tabela sql_modules nie istnieje, więc użyłbyś syscomments, otrzymasz wiele rekordów dla przechowywanych procedur o długości większej niż 4000 znaków, ale będą one miały to samo pole c.number, dzięki czemu możesz grupować części razem, aby uzyskać pełny tekst procedury składowanej:

    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

To zapytanie zwraca nazwę i treść dowolnej procedury składowanej, do której odwołuje się „XXXX” w ramach procedury składowanej.

Jest to całkiem przydatne przy wyszukiwaniu procedur odwołujących się do konkretnej tabeli / widoku / procedury


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

Tak napisałem w SQL 2012, aby wybrać wszystkie procedury składowane, w których nazwa taka jak „CompanySpecialisation”


0

Procedura przechowywana dla wyszukiwania tekstu w 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

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

Spróbuj tego .....


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

Spowoduje to wyszukiwanie we wszystkich procedurach przechowywanych we wszystkich bazach danych. Będzie to również działać w przypadku długich procedur.


0

Używam tego skryptu. Jeśli zmienisz Komentarze XML, aby wyświetlały się jako czarny tekst na żółtym tle, uzyskasz efekt podświetlenia szukanego tekstu w kolumnie xml wyników. (Narzędzia -> Opcje -> Środowisko -> Czcionki i kolory [Wyświetl elementy: Komentarz XML]

    ---------------------------------------------
    --------------   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     -----------------
    ---------------------------------------------
    ---------------------------------------------
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.