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