web-dev-qa-db-ja.com

関数を呼び出すすべてのストアドプロシージャを検索する

SQL Server2005で特定のユーザー定義関数を呼び出しているすべてのストアドプロシージャを確認するにはどうすればよいですか。

または、ストアドプロシージャがその関数を呼び出し、そのパラメータ関数に値を渡さない場合にデフォルト値を想定するように、ユーザー定義関数のパラメータにデフォルト値を割り当てる方法。

よろしく、Abhishek jain

18
Abhishek Jain

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) を使用して、関数のすべての使用法を見つけることもできます。

27
KM.

このプロシージャを使用して、ストアドプロシージャ内のテキストを検索します。

   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
5
hgulyan
  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
4
user1553525

Hgulyanが提案するSYSCOMMENTSテーブルを使用する場合は、注意が必要です。このテーブルには、オブジェクトの定義が複数の行に分割されており、2つのエントリに分割すると、検索条件が失われる可能性があります。 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
1
John Franklin

関数を使用してすべてのストアドプロシージャを検索する「ローテク」な方法は、Management Studioを使用してすべてのプロシージャの「スクリプトを生成」して1つのファイルにし、エディタウィンドウを使用して検索するキーワードを検索することです。 。

0
E.J. Brennan