it-swarm.asia

بحث النص في الإجراء المخزن في SQL Server

أريد البحث عن نص من جميع الإجراءات المخزنة في قاعدة البيانات الخاصة بي. يمكنني استخدام 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] في جميع الإجراءات المخزنة بما في ذلك الأقواس المربعة ، لكنه لا يعطي النتيجة الصحيحة. كيف يمكنني تغيير استعلامي لتحقيق ذلك؟

681
DharaPPatel

الهروب من الأقواس المربعة:

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

بعد ذلك ، سيتم التعامل مع الأقواس المربعة كحرف خيطية وليست كرموز عشوائية.

501
Mahmoud Gamal

جرب هذا الطلب:

استعلام

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

هل حاولت استخدام بعض أدوات الطرف الثالث لإجراء البحث؟ هناك العديد من الأشياء المتوفرة المجانية والتي وفرت لي الكثير من الوقت في الماضي.

فيما يلي اثنين من إضافات SSMS اعتدت عليها بنجاح جيد.

بحث ApexSQL - يبحث في المخطط والبيانات في قواعد البيانات ويحتوي على ميزات إضافية مثل تتبع التبعية والمزيد ...

حزمة أدوات SSMS - لها نفس وظيفة البحث مثل سابقتها والعديد من الميزات الرائعة الأخرى. ليست حرة ل SQL Server 2012 ولكن لا يزال بأسعار معقولة جدا.

أعلم أن هذه الإجابة ليست مرتبطة بنسبة 100٪ بالأسئلة (التي كانت أكثر تحديدًا) ، لكن نأمل أن يجد آخرون ذلك مفيدًا.

53
David Smithers

عادةً ما أقوم بتشغيل ما يلي لتحقيق ذلك:

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

Redgate's SQL Search أداة رائعة للقيام بذلك ، إنه مكون إضافي مجاني لـ SSMS.

20
steoleary

ممارسة جيدة للعمل مع 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 '%'[email protected]+'%'
    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 '%'[email protected]+'%'
    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 '%'[email protected]+'%'
               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 '%'[email protected]+'%'
        ORDER BY
               Table_Name
    END
END

الآن - تعيين مفتاح قصير على النحو التالي ،

 enter image description here

لذلك في المرة القادمة كلما أردت العثور على نص معين في أي من الكائنات الأربعة مثل Store procedure و Views و Functions و Tables. تحتاج فقط إلى كتابة هذه الكلمة الرئيسية والضغط على مفتاح قصير.

على سبيل المثال: أريد البحث عن "PaymentTable" ثم اكتب "PaymentTable" في محرر الاستعلام واضغط مفتاح قصير ctrl+4 - سيوفر لك النتيجة الكاملة.

19
pedram

يمكنك أيضًا استخدام هذا:

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

يرجى أخذ هذا كبديل "قذر" ولكن هذا حفظ خلفي عدة مرات خاصة عندما كنت غير معتاد على مشروع DB. في بعض الأحيان تحاول البحث عن سلسلة داخل جميع SPs وتنسى أن بعض المنطق ذي الصلة قد يكون مختبئًا بين الدالات والمشغلات أو يمكن ببساطة صياغة الكلمات بطريقة مختلفة عما كنت تعتقد.

من MSSMS الخاص بك ، يمكنك النقر بزر الماوس الأيمن فوق قاعدة بياناتك وتحديدTasks -> Generate Scriptsالمعالج لإخراج جميع SPs و Fns والمشغلات في ملف .sql واحد.

 enter image description here

تأكد من تحديد مشغلات أيضا!

 enter image description here

ثم استخدم Sublime أو Notepad للبحث عن السلسلة التي تحتاج إلى البحث عنها. أعلم أن هذا قد يكون غير فعال واتباع نهج بجنون العظمة ولكنه يعمل :)

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

قد يساعدك!

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 '%['[email protected]_TEXT+']%'
      ORDER BY TYPE_DESC
5
Anil Singh
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
G R

كما يمكنك استخدام:

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

هذا يشمل التعليقات

4
Daniel RG

قمت بإنشاء إجراء للبحث عن نص في الإجراءات أو الجداول أو طرق العرض أو الوظائف. المعلمة الأولى @ البحث هي معيار البحث ، @ 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 = ''P''
    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 = ''P''
    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
3
Weihui Guo

باستخدام 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 ; 

استخدام هذا الرمز المزدوج [[]ABD] يشبه الهروب:

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

جرب هذا أيضًا:

   SELECT ROUTINE_NAME 
    FROM INFORMATION_SCHEMA.ROUTINES 
    WHERE ROUTINE_DEFINITION like '%\[ABD\]%'
2
A.D.
 SELECT DISTINCT OBJECT_NAME([id])--,syscomments.* this gives name of 
 --stored procedures that text found

 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]) -> اسم الكائن (عرض ، إجراء مخزن ، Funciton عددي ، اسم وظيفة الجدول)

المعرف (int) = رقم تعريف الكائن

xtype char (2) نوع الكائن. يمكن أن يكون أحد أنواع الكائنات التالية:

FN = وظيفة العددية

P = الإجراء المخزن

V = عرض

TF = وظيفة الجدول

2
Atahan Ceylan
Select distinct OBJECT_NAME(id) from syscomments where text like '%string%' AND OBJECTPROPERTY(id, 'IsProcedure') = 1 
1
Gopakumar N.Kurup
-- 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
0
Abhinav Sharma

في كثير من الأحيان أستخدم هذا البرنامج النصي لمعرفة أي procs لتعديله ، أو لمعرفة ما يستخدم عمود جدول ، أو هذا الجدول على الإطلاق لإزالة بعض البريد غير الهام القديم. يتحقق كل قاعدة بيانات على المثيل الذي يتم تشغيله بواسطة 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 
0
jesterm

هذا الاستعلام هو نص البحث في الإجراء المخزن من جميع قواعد البيانات.

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
Nokcha
/* 
    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
groggyjava