SQL Serverのストアドプロシージャのテキストを検索する


820

すべてのデータベースストアドプロシージャからテキストを検索したい。以下のSQLを使用します。

SELECT DISTINCT
       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
 WHERE m.definition Like '%[ABD]%';

[ABD]角かっこを含むすべてのストアドプロシージャで検索したいのですが、適切な結果が得られません。これを達成するためにクエリをどのように変更できますか?

回答:


570

大括弧をエスケープします。

...
WHERE m.definition Like '%\[ABD\]%' ESCAPE '\'

次に、角括弧はワイルドカードとしてではなく文字列リテラルとして扱われます。


スキーマ名を付けない:(
Imad

4
@Imadスキーマ名SCHEMA_NAME(o.schema_id) AS Schema_Nameは、select句に追加することで取得できます。
patricus 16

6
これは、より長いストアドプロシージャでは機能しません。代わりに、以下のUllasのSQLを使用してください。
Charles Graham

3
この回答がストアドプロシージャテキストの最初の4000文字のみを検索するという難しい方法を見つけました。実際の答えについては、このリンクを確認してください。 sqlhints.com/2011/10/01/…–
ハンターネルソン

ここでも同じように、information_schemaは(SProcs内で)content-textを検索しませんでしたが、代わりに "sys.procedures"を使用できました。Microsoftがinformation_schemaの使用を推奨していることを理解していますが、明らかにこれは多くの場合機能しないため、Microsoftはこの問題を調査する必要があります。
Eddie Kumar

319

このリクエストを試してください:

クエリ

SELECT name
FROM   sys.procedures
WHERE  Object_definition(object_id) LIKE '%strHell%'

56

サードパーティのツールを使用して検索を試しましたか?無料で利用できるものがいくつかあり、過去に私を大幅に時間を節約しました。

以下は、私が成功裏に使用した2つのSSMSアドインです。

ApexSQL検索 –データベースのスキーマとデータの両方を、依存関係の追跡などの追加機能を備えています…

SSMSツールパック –以前と同じ検索機能と他のいくつかの機能を備えています。SQL Server 2012は無料ではありませんが、それでも非常に手頃な価格です。

私はこの回答が質問(より具体的でした)に完全に関連しているわけではないことを知っていますが、うまくいけば他の人もこれが役立つと思います。


35

私は通常それを達成するために以下を実行します:

select distinct object_name(id) 
from syscomments 
where text like '%[ABD]%'
order by object_name(id) 

31

SQL Serverを操作するための良い習慣。

以下のストアドプロシージャを作成し、短いキーを設定します。

CREATE PROCEDURE [dbo].[Searchinall]       
(@strFind AS VARCHAR(MAX))
AS
BEGIN
    SET NOCOUNT ON; 
    --TO FIND STRING IN ALL PROCEDURES        
    BEGIN
        SELECT OBJECT_NAME(OBJECT_ID) SP_Name
              ,OBJECT_DEFINITION(OBJECT_ID) SP_Definition
        FROM   sys.procedures
        WHERE  OBJECT_DEFINITION(OBJECT_ID) LIKE '%'+@strFind+'%'
    END 

    --TO FIND STRING IN ALL VIEWS        
    BEGIN
        SELECT OBJECT_NAME(OBJECT_ID) View_Name
              ,OBJECT_DEFINITION(OBJECT_ID) View_Definition
        FROM   sys.views
        WHERE  OBJECT_DEFINITION(OBJECT_ID) LIKE '%'+@strFind+'%'
    END 

    --TO FIND STRING IN ALL FUNCTION        
    BEGIN
        SELECT ROUTINE_NAME           Function_Name
              ,ROUTINE_DEFINITION     Function_definition
        FROM   INFORMATION_SCHEMA.ROUTINES
        WHERE  ROUTINE_DEFINITION LIKE '%'+@strFind+'%'
               AND ROUTINE_TYPE = 'FUNCTION'
        ORDER BY
               ROUTINE_NAME
    END

    --TO FIND STRING IN ALL TABLES OF DATABASE.    
    BEGIN
        SELECT t.name      AS Table_Name
              ,c.name      AS COLUMN_NAME
        FROM   sys.tables  AS t
               INNER JOIN sys.columns c
                    ON  t.OBJECT_ID = c.OBJECT_ID
        WHERE  c.name LIKE '%'+@strFind+'%'
        ORDER BY
               Table_Name
    END
END

今-以下のように短いキーを設定し、

ここに画像の説明を入力してください

次回だからあなたのような4つのオブジェクトのいずれかで特定のテキストを検索したい時はいつでもStore procedureViewsFunctionsTables。あなたはそのキーワードを書いてショートカットキーを押すだけです。

例:「PaymentTable」を検索してから「PaymentTable」と書き込み、クエリエディターで書き込んだキーワードを選択またはハイライト表示して、ショートカットキーを押すctrl+4と、完全な結果が得られます。


SSMS v18.2(Azureに接続)では、コードは適切に機能します。短いキーはProcedure or function 'Searchinall' expects parameter '@strFind', which was not supplied何かアイデアを返しますか?
gordon613

@ gordon613 SSMSでショートカットキーを押しながら検索するためのキーワードを入力しましたか?例:「従業員」、次にctrl + 4
pedram

@pedram。-ありがとう!私は今、それが働いて持っている-私のセットアップでキーワードを入力する必要があり、それを強調表示し、その後、 CTRL + 4を押す
gordon613

はい、CTRL + 4を押す前にキーワードをハイライト/選択する必要があります。相棒、ありがとな!
pedram

1
@AngelWarrior、あなたは新しいクエリでそれを試したかもしれませんが、あなたのためにうまくいくはずでした。SSMSを再起動する必要はありません。SSMS 18.2。のショートカットパスを提供していただきありがとうございます。
pedram


19

これを「汚い」代替手段として考えてください。これは、特にDBプロジェクトに慣れていない場合に、多くの場合私の背後を救いました。すべてのSP内で文字列を検索しようとしているときに、関連するロジックの一部が関数とトリガーの間に隠れていることを忘れている場合があります非表示になっている可能性があることや、思ったよりも単純に言い方を変えることができることあります。

MSSMSからDBを右クリックしてTasks -> Generate Scriptsウィザードを選択し 、すべてのSP、Fns、トリガーを単一の.sqlファイルに出力できます。

ここに画像の説明を入力してください

トリガーも選択してください!

ここに画像の説明を入力してください

次に、Sublimeまたはメモ帳使用して、検索する必要がある文字列を検索します。これは非常に非効率的で偏執的なアプローチかもしれませんが、うまくいきます:)


12

これを使用することもできます:

SELECT * 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION like '%Search_String%'

9
-1他のオプションと比較した場合の欠点INFORMATION_SCHEMA.ROUTINES.ROUTINE_DEFINITIONは、ルーチンの最初の4000文字のみを保持することです。
シャノン退職2014年

8

それはあなたを助けるかもしれません!

SELECT DISTINCT 
      A.NAME AS OBJECT_NAME,
      A.TYPE_DESC
      FROM SYS.SQL_MODULES M 
      INNER JOIN SYS.OBJECTS A ON M.OBJECT_ID = A.OBJECT_ID
      WHERE M.DEFINITION LIKE '%['+@SEARCH_TEXT+']%'
      ORDER BY TYPE_DESC

7
select top 10 * from
sys.procedures
where object_definition(object_id) like '%\[ABD\]%'

6
SELECT DISTINCT 
   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 WHERE m.definition Like '%[String]%';

5

また、あなたは使うことができます:

SELECT OBJECT_NAME(id) 
    FROM syscomments 
    WHERE [text] LIKE '%flags.%' 
    AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
    GROUP BY OBJECT_NAME(id)

それにはコメントが含まれています


3
この目的でsyscommentsを使用しないでください。テキストフィールドは4000文字で途切れます。sys.sql_modulesの定義フィールドには、テキスト全体(とにかく4000以上)が格納されているようです
jlnorsworthy

5
 SELECT DISTINCT OBJECT_NAME([id]),[text] 

 FROM syscomments   

 WHERE [id] IN (SELECT [id] FROM sysobjects WHERE xtype IN 

 ('TF','FN','V','P') AND status >= 0) AND  

 ([text] LIKE '%text to be search%' ) 

OBJECT_NAME([id])->オブジェクト名(ビュー、ストアプロシージャ、スカラー関数、テーブル関数名)

id(int)=オブジェクト識別番号

xtype char(2)オブジェクトタイプ。次のオブジェクトタイプのいずれかになります。

FN =スカラー関数

P =ストアドプロシージャ

V =ビュー

TF =テーブル関数


4

プロシージャ/関数、テーブル、ビュー、またはジョブのテキストを検索するプロシージャを作成しました。最初のパラメータ@searchは検索条件、@ targetは検索ターゲット、つまりプロシージャ、テーブルなどです。指定されていない場合は、すべて検索します。@dbは検索するデータベースを指定するもので、デフォルトは現在のデータベースです。これが動的SQLでの私のクエリです。

ALTER PROCEDURE [dbo].[usp_find_objects]
(
    @search VARCHAR(255),
    @target VARCHAR(255) = NULL,
    @db VARCHAR(35) = NULL
)
AS

SET NOCOUNT ON;

DECLARE @TSQL NVARCHAR(MAX), @USEDB NVARCHAR(50)

IF @db <> '' SET @USEDB = 'USE ' + @db
ELSE SET @USEDB = ''

IF @target IS NULL SET @target = ''

SET @TSQL = @USEDB + '

DECLARE @search VARCHAR(128) 
DECLARE @target VARCHAR(128)

SET @search = ''%' + @search + '%''
SET @target = ''' + @target + '''

IF @target LIKE ''%Procedure%'' BEGIN
    SELECT o.name As ''Stored Procedures''
    FROM SYSOBJECTS o 
    INNER JOIN SYSCOMMENTS c ON o.id = c.id
    WHERE c.text LIKE @search
        AND o.xtype IN (''P'',''FN'')
    GROUP BY o.name
    ORDER BY o.name
END

ELSE IF @target LIKE ''%View%'' BEGIN
    SELECT o.name As ''Views''
    FROM SYSOBJECTS o 
    INNER JOIN SYSCOMMENTS c ON o.id = c.id
    WHERE c.text LIKE @search
        AND o.xtype = ''V''
    GROUP BY o.name
    ORDER BY o.name
END

/* Table - search table name only, need to add column name */
ELSE IF @target LIKE ''%Table%'' BEGIN
    SELECT t.name AS ''TableName''
    FROM sys.columns c 
    JOIN sys.tables t ON c.object_id = t.object_id
    WHERE c.name LIKE @search
    ORDER BY TableName
END

ELSE IF @target LIKE ''%Job%'' BEGIN
    SELECT  j.job_id,
        s.srvname,
        j.name,
        js.step_id,
        js.command,
        j.enabled 
    FROM    [msdb].dbo.sysjobs j
    JOIN    [msdb].dbo.sysjobsteps js
        ON  js.job_id = j.job_id 
    JOIN    master.dbo.sysservers s
        ON  s.srvid = j.originating_server_id
    WHERE   js.command LIKE @search
END

ELSE BEGIN 
    SELECT o.name As ''Stored Procedures''
    FROM SYSOBJECTS o 
    INNER JOIN SYSCOMMENTS c ON o.id = c.id
    WHERE c.text LIKE @search
        AND o.xtype IN (''P'',''FN'')
    GROUP BY o.name
    ORDER BY o.name

    SELECT o.name As ''Views''
    FROM SYSOBJECTS o 
    INNER JOIN SYSCOMMENTS c ON o.id = c.id
    WHERE c.text LIKE @search
        AND o.xtype = ''V''
    GROUP BY o.name
    ORDER BY o.name

    SELECT t.name AS ''Tables''
    FROM sys.columns c 
    JOIN sys.tables t ON c.object_id = t.object_id
    WHERE c.name LIKE @search
    ORDER BY Tables

    SELECT  j.name AS ''Jobs''
    FROM    [msdb].dbo.sysjobs j
    JOIN    [msdb].dbo.sysjobsteps js
        ON  js.job_id = j.job_id 
    JOIN    master.dbo.sysservers s
        ON  s.srvid = j.originating_server_id
    WHERE   js.command LIKE @search
END
'

EXECUTE sp_executesql @TSQL

更新: プロシージャの名前を変更した場合、更新のみsysobjectsが行われsyscomments、古い名前が保持されるため、プロシージャを削除して再作成しない限り、そのプロシージャは検索結果に含まれません。


このリンクをたどって列名を検索します。
Weihui Guo 2018

3

CHARINDEXの使用:

SELECT DISTINCT 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
WHERE CHARINDEX('[ABD]',m.definition) >0 ;

PATINDEXの使用:

SELECT DISTINCT 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
WHERE PATINDEX('[[]ABD]',m.definition) >0 ; 

このdoubleの使用[[]ABD]は、エスケープに似ています:

WHERE m.definition LIKE '%[[]ABD]%'

3

これも試してください:

   SELECT ROUTINE_NAME 
    FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_DEFINITION like '%\[ABD\]%'

1
Select distinct OBJECT_NAME(id) from syscomments where text like '%string%' AND OBJECTPROPERTY(id, 'IsProcedure') = 1 

1

このクエリは、すべてのデータベースからのストアドプロシージャの検索テキストです。

DECLARE @T_Find_Text VARCHAR(1000) = 'Foo'

IF OBJECT_ID('tempdb..#T_DBNAME') IS NOT NULL DROP TABLE #T_DBNAME
IF OBJECT_ID('tempdb..#T_PROCEDURE') IS NOT NULL DROP TABLE #T_PROCEDURE

CREATE TABLE #T_DBNAME
(
    IDX int IDENTITY(1,1) PRIMARY KEY 
    , DBName VARCHAR(255)
)

CREATE TABLE #T_PROCEDURE
(
    IDX int IDENTITY(1,1) PRIMARY KEY 
    , DBName VARCHAR(255)
    , Procedure_Name VARCHAR(MAX)
    , Procedure_Description VARCHAR(MAX)
)

INSERT INTO #T_DBNAME (DBName)
SELECT name FROM master.dbo.sysdatabases

DECLARE @T_C_IDX INT = 0
DECLARE @T_C_DBName VARCHAR(255)
DECLARE @T_SQL NVARCHAR(MAX)
DECLARE @T_SQL_PARAM NVARCHAR(MAX) 

SET @T_SQL_PARAM =   
    '   @T_C_DBName VARCHAR(255)
        , @T_Find_Text VARCHAR(255)
    '  


WHILE EXISTS(SELECT TOP 1 IDX FROM #T_DBNAME WHERE IDX > @T_C_IDX ORDER BY IDX ASC)
BEGIN

    SELECT TOP 1 
    @T_C_DBName = DBName 
    FROM #T_DBNAME WHERE IDX > @T_C_IDX ORDER BY IDX ASC

    SET @T_SQL = ''

    SET @T_SQL = @T_SQL + 'INSERT INTO #T_PROCEDURE(DBName, Procedure_Name, Procedure_Description)'
    SET @T_SQL = @T_SQL + 'SELECT SPECIFIC_CATALOG, ROUTINE_NAME, ROUTINE_DEFINITION '
    SET @T_SQL = @T_SQL + 'FROM ' + @T_C_DBName +  '.INFORMATION_SCHEMA.ROUTINES  '
    SET @T_SQL = @T_SQL + 'WHERE ROUTINE_DEFINITION LIKE ''%''+ @T_Find_Text + ''%'' '
    SET @T_SQL = @T_SQL + 'AND ROUTINE_TYPE = ''PROCEDURE'' '

    BEGIN TRY
        EXEC SP_EXECUTESQL  @T_SQL, @T_SQL_PARAM, @T_C_DBName, @T_Find_Text
    END TRY
    BEGIN CATCH
        SELECT @T_C_DBName + ' ERROR'
    END CATCH

    SET @T_C_IDX = @T_C_IDX + 1
END

SELECT IDX, DBName, Procedure_Name FROM #T_PROCEDURE ORDER BY DBName ASC

0
/* 
    SEARCH SPROCS & VIEWS

    The following query will allow search within the definitions 
    of stored procedures and views.

    It spits out the results as XML, with the full definitions, 
    so you can browse them without having to script them individually.

*/

/*
   STEP 1: POPULATE SEARCH KEYS. (Set to NULL to ignore)
*/
DECLARE 
    @def_key varchar(128) = '%foo%',      /* <<< definition search key */
    @name_key varchar(128) = '%bar%',     /* <<< name search key       */
    @schema_key varchar(128) = 'dbo';     /* <<< schema search key     */

;WITH SearchResults AS (
    /* 
       STEP 2: DEFINE SEARCH QUERY AS CTE (Common Table Expression)
    */
    SELECT 
        [Object].object_id                       AS [object_id],    
        [Schema].name                            AS [schema_name], 
        [Object].name                            AS [object_name],
        [Object].type                            AS [object_type],
        [Object].type_desc                       AS [object_type_desc],
        [Details].definition                     AS [module_definition]
    FROM  
        /* sys.sql_modules = where the body of sprocs and views live */
        sys.sql_modules AS [Details] WITH (NOLOCK)
    JOIN
        /* sys.objects = where the metadata for every object in the database lives */
        sys.objects AS [Object] WITH (NOLOCK) ON [Details].object_id = [Object].object_id
    JOIN 
        /* sys.schemas = where the schemas in the datatabase live */
        sys.schemas AS [Schema] WITH (NOLOCK) ON [Object].schema_id = [Schema].schema_id
    WHERE 
        (@def_key IS NULL OR [Details].definition LIKE @def_key)      /* <<< searches definition */
        AND (@name_key IS NULL OR [Object].name LIKE @name_key)       /* <<< searches name       */
        AND (@schema_key IS NULL OR [Schema].name LIKE @schema_key)   /* <<< searches schema     */
)
/* 
   STEP 3: SELECT FROM CTE INTO XML
*/

/* 
    This outer select wraps the inner queries in to the <sql_object> root element 
*/
SELECT 
(
    /* 
        This inner query maps stored procedure rows to <procedure> elements
    */
    SELECT TOP 100 PERCENT
        [object_id]                            AS [@object_id], 
        [schema_name] + '.' + [object_name]    AS [@full_name],
        [module_definition]                    AS [module_definition]
    FROM
        SearchResults
    WHERE
        object_type = 'P'
    ORDER BY
        [schema_name], [object_name]
    FOR XML
        PATH ('procedure'), TYPE
) AS [procedures],  /* <<< as part of the outer query, 
                           this alias causes the <procedure> elements
                           to be wrapped within the <procedures> element */
(
    /* 
        This inner query maps view rows to <view> elements
    */
    SELECT TOP 100 PERCENT 
        [object_id]                            AS [@object_id], 
        [schema_name] + '.' + [object_name]    AS [@full_name],
        [module_definition]                    AS [module_definition]
    FROM
        SearchResults
    WHERE
        object_type = 'V'
    ORDER BY
        [schema_name], [object_name]
    FOR XML
        PATH ('view'), TYPE
) AS [views]  /* <<< as part of the outer query, 
                     this alias causes the <view> elements
                     to be wrapped within the <views> element */
FOR XML 
    PATH ('sql_objects')

0

このスクリプトを使用して、変更するprocを特定したり、テーブルの列を使用しているものを特定したり、古いテーブルを削除するためにテーブルを使用したりすることがよくあります。それは、素晴らしく供給されたsp_msforeachdbによって実行されたインスタンス上の各データベースをチェックします。

if object_id('tempdb..##nothing') is not null
    drop table ##nothing

CREATE TABLE ##nothing
(
    DatabaseName varchar(30),
    SchemaName varchar(30),
    ObjectName varchar(100),
    ObjectType varchar(50)
)

EXEC master.sys.sp_msforeachdb 
'USE ?
insert into ##nothing
SELECT 
db_name() AS [Database],
[Scehma]=schema_name(o.schema_id), 
o.Name, 
o.type 
FROM sys.sql_modules m
INNER JOIN sys.objects o
    ON o.object_id = m.object_id
WHERE 
    m.definition like ''%SOME_TEXT%'''  
--edit this text

SELECT * FROM ##nothing n
order by OBJECTname 

ああ、そう...そうです!
ビットコイン殺人マニアック2017年

0
-- Applicable for SQL 2005+
USE YOUR_DATABASE_NAME //;
    GO

SELECT [Scehma] = schema_name(o.schema_id)
    ,o.NAME
    ,o.type
FROM sys.sql_modules m
INNER JOIN sys.objects o ON o.object_id = m.object_id
WHERE m.DEFINITION LIKE '%YOUR SEARCH KEYWORDS%'
GO

-2

あなたも使うことができます

CREATE PROCEDURE [Search](
    @Filter nvarchar(max)
)
AS
BEGIN

SELECT name
FROM   procedures
WHERE   definition LIKE '%'+@Filter+'%'

END

そして実行する

exec [Search] 'text'

WHERE句にフィールド参照がありません。また、スキーマ(sys)も参照する必要があります
Roger Willcocks
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.