2010-05-14 3 views
16

Jak mogę dowiedzieć się wszystkich procedur przechowywanych, które są wzywające szczególną funkcję zdefiniowaną przez użytkownika w SQL Server 2005.Znalezienie wszystkich zapisanych procedur Wywołanie funkcji

Albo jak przypisać wartość defult do parametru w zdefiniowanych przez użytkownika działa tak, że gdy procedura składowana wywołuje tę funkcję i nie przekazuje żadnej wartości do tej funkcji parametru przyjmuje wartość domyślną.

Pozdrawiam, Abhishek Jain

Odpowiedz

0

A „low-tech” sposób znaleźć wszystkie procedury przechowywane przy użyciu funkcji jest użycie Management Studio do „wygenerować skrypty” dla wszystkich proca w jednym pliku, a następnie użyj okna edytora, aby wyszukać słowa kluczowe, które chcesz znaleźć.

+0

Chyba słyszeliście podobny sposób robienia tego, ale nie wiem, jak generować skrypty dla wszystkich proców za jednym razem. Czy możesz pomóc. W każdym razie, proszę o szybką odpowiedź. –

+0

Dlaczego wypełniasz wszystkie procedury w pliku, jeśli możesz wyszukiwać w swoich procedurach przechowywanych w db z SP dodanym do mojej odpowiedzi? – hgulyan

5

Po prostu użyj tej procedury, aby znaleźć dowolny tekst w swoich procedurach przechowywanych.

CREATE PROCEDURE [dbo].[Find_Text_In_SP] 
@StringToSearch varchar(100) 
AS 
    SET @StringToSearch = '%' [email protected] + '%' 
    SELECT Distinct SO.Name 
    FROM sysobjects SO (NOLOCK) 
    INNER JOIN syscomments SC (NOLOCK) on SO.Id = SC.ID 
    AND SO.Type = 'P' 
    AND SC.Text LIKE @stringtosearch 
    ORDER BY SO.Name 
+0

Twoja odpowiedź rozwiązała mój problem Thnx –

+1

nie ma za co. Jeśli jest to potrzebne, zaakceptuj to jako odpowiedź. – hgulyan

+2

'syscomments' nie jest tabelą do użycia, użyj' sys.sql_modules' jak w mojej odpowiedzi! Powodem jest, że 'syscomments.Text' to' nvarchar (4000) ', ale' sys.sql_modules.definition' to 'nvarchar (max)'. Spowoduje to nieodnalezienie docelowego ciągu znaków, jeśli znajduje się on między dwoma rzędami syscommentów. –

25

ZAPYTANIE sys.sql_modules
użyć tej procedury, gdzie przechodzą w nazwie funkcji:

CREATE PROCEDURE dbo.Find_Text 
    @SearchValue nvarchar(500) 
AS 

SELECT DISTINCT 
    s.name+'.'+o.name AS Object_Name,o.type_desc 
    FROM sys.sql_modules  m 
     INNER JOIN sys.objects o ON m.object_id=o.object_id 
     INNER JOIN sys.schemas s ON o.schema_id=s.schema_id 
    WHERE m.definition Like '%'[email protected]+'%' 
     --AND o.Type='P' --<uncomment if you only want to search procedures 
    ORDER BY 1 
GO 

Ta procedura wyszukiwania w obrębie procedur, widoków i funkcji dla danego łańcucha. Możesz wyszukać dowolny ciąg znaków, a nie tylko nazwy funkcji. Możesz również umieścić symbole wieloznaczne w środku wyszukiwanego hasła.

FUNKCJE DEFAULTS
można określić wartości domyślne dla parametrów funkcji. Jednakże, gdy parametr funkcji ma wartość domyślną, słowo kluczowe DEFAULT musi zostać określone, gdy funkcja ma odzyskać wartość domyślną. To zachowanie różni się od używania parametrów z wartościami domyślnymi w procedurach składowanych, w których pominięcie parametru powoduje również domyślną wartość.

go wypróbować:

CREATE FUNCTION dbo.Just_Testing 
(
    @Param1 int 
    ,@Param2 int=0 
) 
RETURNS varchar(100) 
BEGIN 
    RETURN CONVERT(varchar(10),@Param1)+'-'+CONVERT(varchar(10),@Param2) 
END 
GO 

PRINT 'hello world '+dbo.Just_Testing(2,default)+', '+dbo.Just_Testing(5,2) 
GO 
PRINT 'hello world '+dbo.Just_Testing(2  )+', '+dbo.Just_Testing(5,2) 

WYJŚCIE:

hello world 2-0, 5-2 
Msg 313, Level 16, State 2, Line 1 
An insufficient number of arguments were supplied for the procedure or function dbo.Just_Testing. 

Ale zgaduję, że trzeba zmienić funkcję, dodając jako parametr, a teraz trzeba go naprawić wszędzie. Ta DEFAULT nadal będzie wymagała tyle pracy, ponieważ musisz dotknąć każdego wykonanego połączenia.

SP_DEPENDS
można również użyć sp_depends (Transact-SQL) znaleźć każde użycie tej funkcji.

1

Musisz zachować ostrożność podczas używania tabeli SYSCOMMENTS zgodnie z sugestią hgulyan ... Ta tabela zawiera definicję obiektu podzieloną na wiele wierszy i może spowodować utratę kryteriów wyszukiwania, jeśli zostanie podzielona na dwa wpisy . W SQL 2005 i nowszych można użyć tabeli SYSMODULES. Uruchom poniższy kod, żeby zobaczyć różnice i gdzie szukać wystąpień słów kluczowych (czyli - ewentualnie frazy wyszukiwania) zostały podzielone na kilka wierszy przy użyciu metody syscomments ...


SELECT TOP 1000 SO.NAME, SC.TEXT 
FROM  SYS.SYSOBJECTS SO 
JOIN  SYS.SYSCOMMENTS SC 
    ON  SO.ID = SC.ID 
WHERE  SO.TYPE = 'P' 
ORDER BY SO.NAME, SC.COLID 


SELECT TOP 1000 SO.NAME, SM.DEFINITION 
FROM  SYS.SYSOBJECTS SO 
JOIN  SYS.SQL_MODULES SM 
    ON  SO.ID = SM.[OBJECT_ID] 
WHERE  SO.TYPE = 'P' 
ORDER BY SO.NAME 
+0

I KM pobił mnie, gdy pisałem swoją odpowiedź ... :) –

+0

Z powrotem w dniu, miałem procedurę, która połączyła się z SYS.SYSCOMMENTS dwa razy, i zrobiłaby coś takiego jak: "WHERE ISNULL (sc1.Text, '') + ISNULL (sc2.Text, '') LIKE '%' + @ SearchValue + '%' ', aby spróbować wyeliminować problem z luką. –

2
declare @SearchValue as varchar(50) 
    set @SearchValue = 'GETUTCDATE' 
    SELECT DISTINCT 
    s.name+'.'+o.name AS Object_Name,o.type_desc 
    FROM sys.sql_modules  m 
    INNER JOIN sys.objects o ON m.object_id=o.object_id 
    INNER JOIN sys.schemas s ON o.schema_id=s.schema_id 
    WHERE m.definition Like '%'[email protected]+'%' 
    AND o.Type='P' --<uncomment if you only want to search procedures 
    ORDER BY 1