查找调用函数的所有存储过程

时间:2010-05-14 10:28:07

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

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

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

此致 Abhishek耆那教

6 个答案:

答案 0 :(得分:26)

QUERY 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)查找函数的每个用法。

答案 1 :(得分:5)

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

   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

答案 2 :(得分:4)

  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 :(得分:1)

根据hgulyan的建议使用SYSCOMMENTS表时需要小心......该表将对象的定义分成多行,如果在两个条目中分开,可能会导致错过搜索条件。在SQL 2005及更高版本中,您可以使用SYSMODULES表。运行以下代码以查看差异并查找在使用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

答案 4 :(得分:0)

使用函数查找所有存储过程的“低技术”方法是使用管理工作室将所有过程“生成脚本”放入单个文件中,然后使用编辑器窗口搜索关键字想找。

答案 5 :(得分:0)

只需在下面的查询中运行此

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替换。就是这样!