2010-05-14 55 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 
相關問題