Подтвердить что ты не робот

Поиск всех хранимых процедур, вызывающих функцию

Как узнать все хранимые процедуры, вызывающие определенную функцию, определенную пользователем в SQL Server 2005.

Или как назначить значение defult параметру в пользовательской функции, так что, когда хранимая процедура вызывает эту функцию и не передает какое-либо значение этой функции параметра, предполагается значение по умолчанию.

С уважением, Abhishek jain

4b9b3361

Ответ 1

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 '%'[email protected]+'%'
        --AND o.Type='P'  --<uncomment if you only want to search procedures
    ORDER BY 1
GO

Эта процедура выполняет поиск в процедурах, представлениях и функциях для данной строки. Вы можете искать любую строку, а не только имена функций. Вы также можете включить wild cards в середине заданного условия поиска.

ФУНКЦИЯ ПО УМОЛЧАНИЮ
вы можете указать значения по умолчанию для параметров функции. Однако, когда параметр функции имеет значение по умолчанию, ключевое слово 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), чтобы найти каждое использование функции.

Ответ 2

Просто используйте эту процедуру, чтобы найти какой-либо текст в ваших хранимых процедурах.

   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

Ответ 3

Вы должны быть осторожны при использовании таблицы SYSCOMMENTS, как предложено hgulyan... Эта таблица имеет определение объекта, разбитого на несколько строк, и может привести к тому, что ваши критерии поиска будут пропущены, если они будут разбиты на две записи. В 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

Ответ 4

  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

Ответ 5

"Низкотехнологичный" способ найти все хранимые процедуры с помощью функции - использовать студию управления для "генерации сценариев" для всех процессов в одном файле, а затем использовать окно редактора для поиска по ключевым словам, которые вы хочу найти.