【问题标题】:Finding all Stored procedures calling a function查找调用函数的所有存储过程
【发布时间】:2011-02-19 11:24:52
【问题描述】:

如何找出所有在 SQL Server 2005 中调用特定用户定义函数的存储过程。

或者如何为用户定义函数中的参数分配默认值,以便在存储过程调用该函数并且不将任何值传递给该参数函数时采用默认值。

问候, 阿布舍克耆那教

【问题讨论】:

    标签: sql sql-server-2005 user-defined-functions


    【解决方案1】:

    查询 sys.sql_modules
    使用这个过程,你传入函数名:

    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 '%'+@SearchValue+'%'
            --AND o.Type='P'  --<uncomment if you only want to search procedures
        ORDER BY 1
    GO
    

    此过程在过程、视图和函数中搜索给定的字符串。您可以搜索任何字符串,而不仅仅是函数名称。您还可以在给定搜索词的中间添加通配符。

    函数默认值
    您可以指定函数参数的默认值。但是,当函数的参数有默认值时,在函数检索默认值时必须指定关键字DEFAULT。这种行为不同于在存储过程中使用具有默认值的参数,在存储过程中省略参数也意味着默认值。

    试试看:

    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)
    

    输出:

    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.
    

    但我猜你需要更改一个函数,添加为参数,现在需要在任何地方修复它。这个DEFAULT 仍然需要做很多工作,因为您需要触摸对它的每个调用。

    SP_DEPENDS
    您也可以使用sp_depends (Transact-SQL) 查找该功能的所有用法。

    【讨论】:

      【解决方案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 '%'+@SearchValue+'%'
        AND o.Type='P'  --<uncomment if you only want to search procedures
        ORDER BY 1
      

      【讨论】:

        【解决方案3】:

        只需使用此过程查找存储过程中的任何文本。

           CREATE PROCEDURE [dbo].[Find_Text_In_SP]
        @StringToSearch varchar(100) 
        AS 
           SET @StringToSearch = '%' +@StringToSearch + '%'
           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
        

        【讨论】:

        • 不客气。如果这是您需要的,请接受它作为答案。
        • syscomments 不是要使用的表,请在我的回答中使用 sys.sql_modules !原因是syscomments.Text 是nvarchar(4000) 但sys.sql_modules.definition 是nvarchar(max)。如果目标字符串位于两行 syscmets 之间,这将导致找不到目标字符串。
        • 好的,谢谢,但是您的查询将搜索任何地方,不仅在存储过程中,所以这样命名是错误的:)
        • 我修复了名称,并在 WHERE 中添加了一行(已注释掉),因为我敢打赌 OP 想要找到该函数的所有用法,但他们没想到要检查在视图或其他功能中。此外,最好找到更多(视图和函数)并仍然获得所有过程,而不是只找到一些有效的过程,使用 syscmets 就可以了。
        • @KM,同意,你做得很好,它真的很有用,如果我要使用你的查找程序。谢谢:)
        【解决方案4】:

        在使用 hgulyan 建议的 SYSCOMMENTS 表时需要小心...该表的对象定义被分成多行,如果它被分成两个条目,可能会导致您的搜索条件丢失。在 SQL 2005 及更高版本中,您可以改用 SYSMODULES 表。运行以下代码以查看差异并查找在使用 syscmets 方法时关键字(即 - 可能是您的搜索短语)被分成多行的情况...

        
        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
        

        【讨论】:

        • 当我输入答案时,KM 打败了我...... :)
        • 过去,我有一个程序在 SYS.SYSCOMMENTS 中加入了两次,它会执行WHERE ISNULL(sc1.Text,'')+ISNULL(sc2.Text,'') LIKE '%'+@SearchValue+'%' 之类的操作来尝试消除间隙问题。
        【解决方案5】:

        使用函数查找所有存储过程的“低技术”方法是使用 management studio 将所有 procs“生成脚本”到单个文件中,然后使用编辑器窗口搜索您的关键字想找。

        【讨论】:

        • 我想我听说过类似的方法,但不知道如何一次性为所有 proc 生成脚本。你能帮我吗。无论如何,谢谢您的快速回复。
        • 如果您可以使用我添加到答案中的 sp 在 db 中搜索存储过程,为什么要将所有过程填充到文件中?
        【解决方案6】:

        只需运行以下查询:

        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 '%FUNCTION_NAME%'
            --AND o.Type='P'  --<uncomment if you only want to search procedures
        ORDER BY 1
        

        并将 FUNCTION_NAME 替换为您的。就是这样!!

        【讨论】:

          猜你喜欢
          • 2010-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-23
          • 2018-01-09
          • 1970-01-01
          相关资源
          最近更新 更多