我怎么能找出在SQL Server调用特定的用户定义的函数或如何将defult值在为用户分配一个参数来定义2005年找到的所有存储过程调用一个函数
所有的存储过程函数,以便当存储过程调用该函数并且不向该函数传递任何值时,函数将采用默认值。
问候, 阿布舍克耆那教
我怎么能找出在SQL Server调用特定的用户定义的函数或如何将defult值在为用户分配一个参数来定义2005年找到的所有存储过程调用一个函数
所有的存储过程函数,以便当存储过程调用该函数并且不向该函数传递任何值时,函数将采用默认值。
问候, 阿布舍克耆那教
A“低技术”的方式找到使用功能,所有的存储过程是使用Management Studio“生成脚本”的所有特效到一个文件中,然后使用编辑器窗口搜索您想要查找的关键字。
只需使用此过程即可查找存储过程中的任何文本。
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
你的答案解决了我的问题 Thnx – 2010-05-14 10:43:31
不客气。如果这是你需要的,接受它作为答案。 – hgulyan 2010-05-14 10:45:24
'syscomments'不是要使用的表,请在我的答案中使用'sys.sql_modules'!原因是'syscomments.Text'是'nvarchar(4000)',但'sys.sql_modules.definition'是'nvarchar(max)'。如果它位于两行syscomments之间,将导致找不到目标字符串。 – 2010-05-14 12:50:20
查询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)找到函数的每次使用。
当您使用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
当我打开我的答案时,KM击败了我... :) – 2010-05-14 12:51:41
回到当天,我有一个程序在SYS.SYSCOMMENTS中加入了两次,它会做类似'WHERE ISNULL(sc1.Text,'')+ ISNULL(sc2.Text,'')LIKE'%'+ @ SearchValue +'%''尝试消除差距问题。 – 2010-05-14 12:59:42
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
我想我已经听说过一个类似的做法,但不知道如何一次为所有proc生成脚本。 你能帮忙吗? 总之,thnx快速回复。 – 2010-05-14 10:38:25
为什么你将所有过程填充到一个文件中,如果你可以使用sp添加到我的答案中的数据库中搜索存储过程? – hgulyan 2010-05-14 10:41:49