Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 вызов подпрограммы внутри функции  [new]
renegator
Member

Откуда:
Сообщений: 6
вызов обычной процедуры из функции как известно запрещен
однако требуется построить нечто вроде

CREATE FUNCTION [user_function] (@value float, @formula int)
RETURNS float AS
BEGIN
declare @result float
declare @proc_name varchar(30)

if @formula = -1
return @value
else begin
set @proc_name = 'dbo.usp_' + cast(@formula as varchar)
exec @proc_name @result -- Здесь получается ошибка

return @result
end

END

select user_function (field1, field2) from table1;

т.е. user_function должна реализовать выполнение произвольной формулы
нет ли у кого положительного опыта на этот счет?
22 мар 04, 14:15    [590220]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
Slava
Member

Откуда: Сибирь, Новосибирск
Сообщений: 794
Надо курсоры городить.
22 мар 04, 14:32    [590261]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
Slava
Member

Откуда: Сибирь, Новосибирск
Сообщений: 794
Кстати получается у Вас вся таблица будет посчитана по одной и той же формуле?
22 мар 04, 14:35    [590269]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
renegator
Member

Откуда:
Сообщений: 6
ну порезал наверно лишнее. суть все равно не меняется: нужно вызвать подпрограмму изнутри функции. нет ли возможности вызова функции без явного указания имени. по дескриптору или чего-нить навроде

PS чем тут могут помочь курсоры честно говоря не понимаю
22 мар 04, 14:50    [590303]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
Slava
Member

Откуда: Сибирь, Новосибирск
Сообщений: 794
В контексте функции не чем.
По дескриптору вызывать нельзя. Да и вообще в функциях только Extended Stored Procuderes можно вызывать. И никаких exec-ов!
22 мар 04, 14:53    [590313]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Про курсоры я тоже не понял, наверное имеется ввиду как обойтись без функций. Подобная функция должна сто пудов работать, только я делал математику не на процедурах а на функциях, со всеми вытекающими
ограничениями, попробуй обойтись функциями и все будет пучком :)

Теряем субъективно 15% быстродействия по сравнению с жесткой логикой с прстом SELECT.
22 мар 04, 14:59    [590331]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
Slava
Member

Откуда: Сибирь, Новосибирск
Сообщений: 794
Я так понял, что функции хочется добавлять без изменения кода?
Может подойдет
exec 'select ' + [Текст заранее полученной формулы] + ' from MyTable'

Конечно при этом формула должна быть достаточно простой.
22 мар 04, 15:03    [590344]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
renegator
Member

Откуда:
Сообщений: 6
во-во. функциями бы вполне можно было обойтись. но как её вызвать?
насчет exec - внутри функции этот оператор запрещен
22 мар 04, 15:18    [590375]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
renegator
Member

Откуда:
Сообщений: 6
а в смысле запрос давать через "exec"? не пойдет. user_function вызывается в формулах. получается рекурсия
22 мар 04, 16:10    [590517]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Где это написано, что внутри UDF нельзя использовать EXEC?

Насчет рекурсии нужно быть поосторожнее, ето точно!!
22 мар 04, 18:01    [590737]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
Где это написано, что внутри UDF нельзя использовать EXEC?

EXEC можно использовать. Но только для расширенных хранимых процедур.
Написано это в BOL.
22 мар 04, 18:05    [590746]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
BOL:

EXECUTE
Executes a scalar-valued, user-defined function, a system procedure, a user-defined stored procedure, or an extended stored procedure. Also supports the execution of a character string within a Transact-SQL batch.

To invoke a function, use the syntax described for EXECUTE stored_procedure.

и еще ниже

When used to invoke a scalar-valued user-defined function, the @return_status variable can be of any scalar data type.

Где написано, что нельзя вызывать UDF внутри другой UDF посредством EXEC?
22 мар 04, 18:25    [590779]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
Vladimir Luzhkov
Member

Откуда: Санкт-Петербург
Сообщений: 8
BOL:
The following statements are allowed in the body of a multi-statement function. Statements not in this list are not allowed in the body of a function:

[skip]

EXECUTE statements calling an extended stored procedures.
22 мар 04, 18:33    [590796]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
Где написано, что нельзя вызывать UDF внутри другой UDF посредством EXEC?
Где написано что UDF вообще можно выполнить с помощью EXEC ?
22 мар 04, 18:37    [590801]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
mart
Member

Откуда:
Сообщений: 33
Написано об этом в BOL, правда кратко (по крайней мере в обновленной версии BOL от 2004 года)
Что написано Sargos уже написал


create function dbo.fn_test_1 (@id int)
returns varchar(20)
as
begin
return 'fn_test_1:' + ltrim(str(@id))
end
go

create function dbo.fn_test_2 (@id int)
returns varchar(20)
as
begin
return 'fn_test_2:' + ltrim(str(@id))
end
go

create function dbo.fn_test(@id int, @func int)
returns varchar(20)
as
begin
declare @result varchar(20)
declare @function varchar(20)
set set @function = 'fn_test_' + ltrim(str(@func))
exec @result = @function @id = @id
return @result
end
go

select dbo.fn_test(10,1)
select dbo.fn_test(10,2)
go

drop function dbo.fn_test_1
drop function dbo.fn_test_2
drop function dbo.fn_test
go
22 мар 04, 19:40    [590897]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Мдя, вот и думай теперь о природе функций...
22 мар 04, 20:46    [590966]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
renegator
Member

Откуда:
Сообщений: 6
лё колоссаль! собственно на существование подобных фокусов я и надеялся. спасибо открыли глаза неразумному
23 мар 04, 08:48    [591291]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Ага! Но про 15% тоже не забывайте, а я делал всего только 2 функции, причем обе простые, типа умножить на. Да и записейбыло всего 150 тыс.
23 мар 04, 09:03    [591313]     Ответить | Цитировать Сообщить модератору
 Re: вызов подпрограммы внутри функции  [new]
пытливый
Guest
2 mart
Спасибо.
24 мар 04, 06:43    [593400]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить