2010-05-14 52 views
16

我怎么能找出在SQL Server调用特定的用户定义的函数或如何将defult值在为用户分配一个参数来定义2005年找到的所有存储过程调用一个函数

所有的存储过程函数,以便当存储过程调用该函数并且不向该函数传递任何值时,函数将采用默认值。

问候, 阿布舍克耆那教

回答

0

A“低技术”的方式找到使用功能,所有的存储过程是使用Management Studio“生成脚本”的所有特效到一个文件中,然后使用编辑器窗口搜索您想要查找的关键字。

+0

我想我已经听说过一个类似的做法,但不知道如何一次为所有proc生成脚本。 你能帮忙吗? 总之,thnx快速回复。 – 2010-05-14 10:38:25

+0

为什么你将所有过程填充到一个文件中,如果你可以使用sp添加到我的答案中的数据库中搜索存储过程? – hgulyan 2010-05-14 10:41:49

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

你的答案解决了我的问题 Thnx – 2010-05-14 10:43:31

+1

不客气。如果这是你需要的,接受它作为答案。 – hgulyan 2010-05-14 10:45:24

+2

'syscomments'不是要使用的表,请在我的答案中使用'sys.sql_modules'!原因是'syscomments.Text'是'nvarchar(4000)',但'sys.sql_modules.definition'是'nvarchar(max)'。如果它位于两行syscomments之间,将导致找不到目标字符串。 – 2010-05-14 12:50:20

25

查询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 '%'[email protected]+'%' 
     --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) 

OUTPUT:

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

当您使用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 
+0

当我打开我的答案时,KM击败了我... :) – 2010-05-14 12:51:41

+0

回到当天,我有一个程序在SYS.SYSCOMMENTS中加入了两次,它会做类似'WHERE ISNULL(sc1.Text,'')+ ISNULL(sc2.Text,'')LIKE'%'+ @ SearchValue +'%''尝试消除差距问题。 – 2010-05-14 12:59:42

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 
相关问题