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

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

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

С уважением, джайн Abhishek

18
задан hgulyan 23 August 2012 в 13:12
поделиться

4 ответа

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

   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
5
ответ дан 30 November 2019 в 07:18
поделиться

Вы должны быть осторожны при использовании таблицы 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
1
ответ дан 30 November 2019 в 07:18
поделиться

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

0
ответ дан 30 November 2019 в 07:18
поделиться

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), чтобы найти каждое использование функции.

28
ответ дан 30 November 2019 в 07:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: