Поиск всех хранимых процедур, вызывающих функцию
Как узнать все хранимые процедуры, вызывающие определенную функцию, определенную пользователем в SQL Server 2005.
Или как назначить значение defult параметру в пользовательской функции, так что, когда хранимая процедура вызывает эту функцию и не передает какое-либо значение этой функции параметра, предполагается значение по умолчанию.
С уважением,
Abhishek jain
Ответы
Ответ 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
"Низкотехнологичный" способ найти все хранимые процедуры с помощью функции - использовать студию управления для "генерации сценариев" для всех процессов в одном файле, а затем использовать окно редактора для поиска по ключевым словам, которые вы хочу найти.