Создание пользовательской функции в хранимой процедуре в SQL 2005

У меня есть хранимая процедура, в которой я хочу создать определяемую пользователем функцию - Разделить (разбивает строку, разделенную разделителями, и возвращает строки в таблице), использовать функцию и, наконец, удалить функцию.

Мой вопрос в том, могу ли я создать пользовательскую функцию внутри хранимой процедуры и, наконец, удалить ее?

Спасибо.

С уважением НЛВ


person NLV    schedule 24.03.2010    source источник


Ответы (2)


Технически... да, вы могли бы, но это не значит, что вы должны. Вам нужно быть осторожным, избегая операторов GO (просто используйте Exec для каждого пакета), но вы можете сделать что-то вроде:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE dbo.Test
AS

Declare @Sql nvarchar(max)

Set @Sql = 'CREATE FUNCTION dbo.Foo
(   
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT 0 As Bar
)'

Exec(@Sql)

Select * 
From dbo.Foo()


Set @Sql = 'Drop Function dbo.Foo'
Exec(@Sql)

Return
GO
Exec dbo.Test

Тем не менее, я бы настоятельно рекомендовал против такого решения, особенно если вам нужна функция, которая была бы полезна, например, функция разделения. Я бы рекомендовал просто создать UDF, использовать его и оставить до тех пор, пока вы не сможете использовать его снова.

person Thomas    schedule 24.03.2010
comment
Хорошо! Я думал, что это так же, как временная таблица. Если мы создадим временную таблицу в нашем USP, мы, в конце концов, отбросим ее перед выходом, верно? Просто предположил, что нам нужно также отказаться от UDF :) - person NLV; 24.03.2010
comment
Вы не можете создавать временные пользовательские функции в SQL Server (хотя вы можете создавать временные процедуры). Для UDF, который выполняет Splits, я бы рекомендовал просто сделать его постоянным, так как вы, вероятно, будете использовать его снова. - person Thomas; 24.03.2010

CTE также были бы хороши здесь, в зависимости от того, что пытается сделать ваш UDF.

person Zachary Scott    schedule 24.03.2010