2010-05-14 3 views
16

Comment puis-je trouver toutes les procédures stockées appel d'une fonction définie par l'utilisateur particulier dans SQL Server 2005.Trouver toutes les procédures stockées appel d'une fonction

Ou comment attribuer une valeur defult à un paramètre dans un utilisateur défini fonction de sorte que lorsqu'une procédure stockée appelle cette fonction et qu'elle ne transmette aucune valeur à cette fonction de paramètre, elle prend la valeur par défaut.

Cordialement, Abhishek Jain

Répondre

0

Une façon « low-tech » pour trouver toutes les procédures stockées en utilisant une fonction est d'utiliser studio de gestion à « générer des scripts » pour tous les procs en un seul fichier, puis utilisez la fenêtre de l'éditeur pour rechercher les mots-clés que vous voulez trouver. Utilisez simplement cette procédure pour trouver du texte dans vos procédures stockées.

+0

Je crois avoir entendu une façon similaire de le faire, mais ne savent pas comment générer des scripts pour tous les procs en une seule fois. Pouvez-vous aider. De toute façon, merci de répondre rapidement. –

+0

Pourquoi remplissez-vous toutes les procédures dans un fichier, si vous pouvez rechercher dans vos procédures stockées dans db avec sp que j'ai ajouté à ma réponse? – hgulyan

5

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

votre réponse a résolu mon problème Thnx –

+1

de rien. Si c'est ce dont vous avez besoin, acceptez-le comme réponse. – hgulyan

+2

'syscomments' n'est pas la table à utiliser, utilisez' sys.sql_modules' comme dans ma réponse! La raison en est que 'syscomments.Text' est' nvarchar (4000) 'mais' sys.sql_modules.definition' est 'nvarchar (max)'. Cela aboutira à ne pas trouver la chaîne cible si elle se trouve entre deux lignes de syscomments. –

25

QUERY sys.sql_modules
utiliser cette procédure, où l'on passe dans le nom de la fonction:

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 

Cette recherches procédure dans les procédures, les vues et les fonctions de la chaîne donnée. Vous pouvez rechercher n'importe quelle chaîne, pas seulement les noms de fonction. Vous pouvez également inclure des caractères génériques au milieu du terme de recherche donné.

FONCTION DÉFAUT
vous pouvez spécifier des valeurs par défaut des paramètres de la fonction. Cependant, lorsqu'un paramètre de la fonction a une valeur par défaut, le mot-clé DEFAULT doit être spécifié lorsque la fonction récupère la valeur par défaut. Ce comportement est différent de l'utilisation de paramètres avec des valeurs par défaut dans les procédures stockées dans lesquelles l'omission du paramètre implique également la valeur par défaut.

Essayes:

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) 

SORTIE:

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. 

Mais je devine que vous avez besoin de changer une fonction, en ajoutant en tant que paramètre, et maintenant besoin de fixer partout. Cette DEFAULT serait encore autant de travail, car vous devez toucher tous les appels qui y sont faits.

sp_depends
vous pouvez également utiliser sp_depends (Transact-SQL) pour trouver toutes les utilisation de la fonction.

1

Vous devez faire attention lorsque vous utilisez la table SYSCOMMENTS comme suggéré par hgulyan ... Cette table a la définition de l'objet divisé en plusieurs lignes et pourrait faire manquer vos critères de recherche si elle était séparée entre deux entrées . Dans SQL 2005 et versions ultérieures, vous pouvez utiliser la table SYSMODULES à la place. Exécutez le code suivant pour voir les différences et chercher des occurrences où des mots-clés (c.-à-- peut-être votre phrase de recherche) ont été divisés sur plusieurs lignes en utilisant la méthode 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

Et KM m'a battu pendant que je tapais ma réponse ... :) –

+0

de retour dans la journée, j'ai eu une procédure qui a rejoint SYS.SYSCOMMENTS deux fois, et il ferait quelque chose comme 'WHERE ISNULL (sc1.Text, '') + ISNULL (sc2.Text, '') LIKE '%' + @ SearchValue + '%' 'pour essayer d'éliminer le problème avec l'écart. –

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 
Questions connexes