2010-05-14 11 views
16

¿Cómo puedo averiguar todos los procedimientos almacenados que se llama a una función definida por el usuario en particular en SQL Server 2005.Encontrar todos los procedimientos almacenados Llamada a una función

O cómo asignar un valor a un parámetro defult de un usuario definido función para que cuando un procedimiento almacenado llame a esa función y no pase ningún valor a ese parámetro, la función asuma el valor predeterminado.

Saludos, Abhishek Jain

Respuesta

0

A 'baja tecnología' manera de encontrar todos los procedimientos almacenados utilizando una función es utilizar Management Studio "generar scripts" para todos los procs en un solo archivo, y luego utilice la ventana del editor para buscar las palabras clave que desea encontrar.

+0

Creo que han escuchado una forma similar de hacer esto, pero no sé cómo generar scripts para todos los procesos de una vez. Puedes ayudar. De todos modos, THNX para una respuesta rápida. –

+0

¿Por qué completa todos los procedimientos en un archivo, si puede buscar en sus procedimientos almacenados en db con sp que agregué a mi respuesta? – hgulyan

5

Simplemente use este procedimiento para encontrar cualquier texto en sus procedimientos almacenados.

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

tu respuesta ha resuelto mi problema Thnx –

+1

de nada. Si es lo que necesita, acéptelo como respuesta. – hgulyan

+2

'syscomments' no es la tabla para usar, use' sys.sql_modules' como en mi respuesta! La razón es que 'syscomments.Text' es' nvarchar (4000) 'pero' sys.sql_modules.definition' es 'nvarchar (max)'. Esto dará como resultado que no se encuentre la cadena objetivo si está ubicada entre dos filas de syscomments. –

25

CONSULTA sys.sql_modules
uso de este procedimiento, donde se pasa en el nombre de la función:

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 

Este procedimiento búsquedas dentro de los procedimientos, vistas y funciones de la cadena dada. Puede buscar cualquier cadena, no solo nombres de funciones. También puede incluir comodines en el medio del término de búsqueda dado.

predeterminados de funciones
puede especificar valores predeterminados para los parámetros de la función. Sin embargo, cuando un parámetro de la función tiene un valor predeterminado, la palabra clave DEFAULT debe especificarse cuando la función recupera el valor predeterminado. Este comportamiento es diferente de usar parámetros con valores predeterminados en procedimientos almacenados en los que omitir el parámetro también implica el valor predeterminado.

Pruébelo:

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) 

SALIDA:

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. 

Pero supongo que es necesario cambiar una función, añadiendo como parámetro, y ahora hay que fijarlo en todas partes. Esto DEFAULT todavía sería mucho trabajo, ya que debe tocar cada llamada hecha a él.

sp_depends
también se puede utilizar para encontrar sp_depends (Transact-SQL) de cada uso de la función.

1

Debe tener cuidado al usar la tabla SYSCOMMENTS como lo sugiere hgulyan ... Esa tabla tiene la definición del objeto dividida en varias filas y podría hacer que sus criterios de búsqueda se pierdan si se divide en dos entradas . En SQL 2005 y versiones posteriores, puede usar la tabla SYSMODULES en su lugar. Ejecute el código siguiente para ver las diferencias y buscar sucesos en los que (es decir, - posiblemente su búsqueda frase) palabras clave se han dividido en varias líneas cuando se utiliza el método de 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

Y KM me golpeó mientras estaba escribiendo mi respuesta ... :) –

+0

en el pasado, tuve un procedimiento que se unió a SYS.SYSCOMMENTS dos veces, y que haría algo como 'WHERE ISNULL (sc1.Text, '') + ISNULL (sc2.Text, '') LIKE '%' + @ SearchValue + '%' 'para intentar eliminar el problema con el espacio. –

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 
Cuestiones relacionadas