我怎麼能找出在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