tabla - ver codigo procedimiento almacenado sql server




Buscar texto en el procedimiento almacenado en SQL Server (15)

Quiero buscar un texto de todos los procedimientos almacenados de mi base de datos. Yo uso el siguiente 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]%';

Quiero buscar [ABD] en todos los procedimientos almacenados, incluidos los corchetes, pero no está dando el resultado adecuado. ¿Cómo puedo cambiar mi consulta para lograr esto?


¿Has intentado usar algunas de las herramientas de terceros para realizar la búsqueda? Hay varios disponibles por ahí que son gratuitos y que me ahorraron un montón de tiempo en el pasado.

A continuación hay dos complementos SSMS que utilicé con éxito.

Búsqueda de ApexSQL: busca el esquema y los datos en las bases de datos y tiene características adicionales como el seguimiento de dependencias y más ...

Paquete de herramientas SSMS : tiene la misma funcionalidad de búsqueda que la anterior y varias otras funciones geniales. No es gratis para SQL Server 2012 pero sigue siendo muy asequible.

Sé que esta respuesta no está relacionada al 100% con las preguntas (que fue más específica), pero espero que a otros les resulte útil.


Buena práctica para trabajar con SQL Server.

Realice el siguiente procedimiento de almacenamiento y configure la tecla de acceso rápido para esa imagen del fondo,

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

Ahora - Establecer clave corta como abajo,

Por lo tanto, la próxima vez que quiera encontrar un texto en particular en cualquiera de los cuatro objetos, como Store procedure , Views , Functions y Tables . Solo necesitas escribir esa palabra clave y presionar la tecla corta.

Por ejemplo: quiero buscar 'PaymentTable', luego escribir 'PaymentTable' en el editor de consultas y presionar la tecla corta ctrl+4 - le proporcionará el resultado completo.


De vez en cuando utilizo este script para averiguar qué procesos se deben modificar, o para averiguar qué utiliza una columna de una tabla, o esa tabla para eliminar un poco de correo no deseado. Comprueba cada base de datos en la instancia en la que se ejecuta mediante sp_msforeachdb maravillosamente proporcionado.

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 

Escapar de los corchetes:

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

Luego, los corchetes se tratarán como literales de cadena, no como comodines.


Intente esta solicitud:

Consulta

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

Normalmente ejecuto lo siguiente para lograr eso:

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

También puedes usar este:

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

También puedes usar:

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

Eso incluye comentarios


Utilizando 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 ;

Utilizando 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 ; 

Usar este doble [[]ABD] es similar a escapar:

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

prueba también esto

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

Por favor, tome esto como una alternativa "sucia", pero esto me salvó muchas veces, especialmente cuando no estaba familiarizado con el proyecto DB. A veces, está intentando buscar una cadena dentro de todos los SP y olvida que parte de la lógica relacionada puede haberse escondido entre las Funciones y los Disparadores, o simplemente puede redactarse de forma diferente de lo que pensaba.

Desde su MSSMS, puede hacer clic derecho en su base de datos y seleccionar Tasks -> Generate Scripts Asistente para Tasks -> Generate Scripts para generar todos los SP, Fns y activadores en un solo archivo .sql.

Asegúrate de seleccionar Triggers también!

Luego solo usa Sublime o Notepad para buscar la cadena que necesitas encontrar. Sé que este enfoque puede ser bastante ineficiente y paranoico, pero funciona :)


 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]) -> Nombre de objeto (Ver, Procedimiento de almacenamiento, Función escalar, Nombre de función de tabla)

id (int) = número de identificación del objeto

xtype char (2) Tipo de objeto. Puede ser uno de los siguientes tipos de objeto:

FN = función escalar

P = procedimiento almacenado

V = Ver

TF = función de tabla


/* 
    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')

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]%';

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




stored-procedures