Поиск всех хранимых процедур, вызывающих функцию - PullRequest
17 голосов
/ 14 мая 2010

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

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

С уважением, Абхишек джайн

Ответы [ 5 ]

27 голосов
/ 14 мая 2010

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

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

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

5 голосов
/ 14 мая 2010

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

   CREATE PROCEDURE [dbo].[Find_Text_In_SP]
@StringToSearch varchar(100) 
AS 
   SET @StringToSearch = '%' +@StringToSearch + '%'
   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
4 голосов
/ 19 ноября 2014
  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 '%'+@SearchValue+'%'
  AND o.Type='P'  --<uncomment if you only want to search procedures
  ORDER BY 1
1 голос
/ 14 мая 2010

Вы должны быть осторожны при использовании таблицы 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
0 голосов
/ 14 мая 2010

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

...