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

Откуда: Киев
Сообщений: 10
Пишу а-ля интерпретатор:

пользователь описывает выражение, используя описанные мной функции. Я запускаю эти функции. Функции собирают и запускаю скуль-запрос, собирая его из пользовательских параметров.

пользователь описывает выражение в таблице FUNC, например:
BA('ABC') + BB('CBA')
я описываю user defined functions (пример описан ниже) и запускаю:

exec('SELECT ' + SELECT FUNC FROM FUNC)

и что я имею:
1) функцию можно вызывать только с приставочкой "dbo.", то есть пользователь должен писать с приставкой либо нужной "реплейсить". Можно ли использовать более красивое решение?
2) вызов функции вызывает ошибку на строчке EXEC sp_executesql ...
Only functions and extended stored procedures can be executed from within a function.
Но, ведь sp_executesql и есть extended stored procedure? или я чего то не понимаю?


-----------------------------------------
CREATE FUNCTION BA (@bu CHAR(10))
RETURNS NUMERIC(18,2) AS
BEGIN

DECLARE
@val NUMERIC(18,2),
@stm NCHAR(255),
@parm NCHAR(255)

SET @stm = 'SELECT @val = (
SELECT SUM(AMOUNT)
FROM ' + RTRIM(@bu) + '_LDG'
SET @parm = '@val NUMERIC(18,2) OUTPUT'
EXEC sp_executesql @stm, @parm, @val OUTPUT

RETURN @val

END
30 мар 04, 10:54    [603362]     Ответить | Цитировать Сообщить модератору
 Re: Запуск сторенной процедуры из функции  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
автор
Но, ведь sp_executesql и есть extended stored procedure? или я чего то не понимаю?

Не-а, ничего у тебя с sp_executesql не получится...
30 мар 04, 10:56    [603371]     Ответить | Цитировать Сообщить модератору
 Re: Запуск сторенной процедуры из функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
Можно ли использовать более красивое решение?
Вообще-то рекомендуется указывать владельцев для всех объектов, используемых в запросе. Это повышает производительность.

Но, ведь sp_executesql и есть extended stored procedure? или я чего то не понимаю?
Просто sp_executesql тоже нелья использовать в UDF. Просто нельзя.
30 мар 04, 10:58    [603376]     Ответить | Цитировать Сообщить модератору
 Re: Запуск сторенной процедуры из функции  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Если все используемые пользовательские функции имеют одинаковый набор параметров и возвращают скаляр, то собирай имя пользовательской функции
в переменной и вызывай внутри функции типа так:

SET @stm='dbo.'+@bu+'_LDG'
EXEC @Val=@stm @parm1,...
30 мар 04, 14:36    [603889]     Ответить | Цитировать Сообщить модератору
 Re: Запуск сторенной процедуры из функции  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Да сколько раз толдычить - не работает EXEC в ф-иях!
30 мар 04, 14:40    [603899]     Ответить | Цитировать Сообщить модератору
 Re: Запуск сторенной процедуры из функции  [new]
Sargos
Member

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

Сколько можно говорить, что EXEC в UDF МОЖНО!!!
Вот попробуйте сами:

CREATE TABLE [dbo].[Test] (
[Oper] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL ,
[Lft] [float] NULL ,
[Rgt] [float] NULL
) ON [PRIMARY]
GO

CREATE FUNCTION dbo.F_MY_ADD (@Left float, @Right float) RETURNS float AS
BEGIN
RETURN (@Left + @Right)
END
GO

CREATE FUNCTION dbo.F_MY_MUL (@Left float, @Right float) RETURNS float AS
BEGIN
RETURN (@Left * @Right)
END
GO

CREATE FUNCTION dbo.F_MY_OPER (@Oper varchar(64), @Left float, @Right float) RETURNS float AS
BEGIN
DECLARE @Res float
SET @Oper='dbo.F_MY_'+@Oper
IF OBJECT_ID(@Oper) IS NOT NULL EXEC @Res=@Oper @Left, @Right
ELSE SET @Res=0
RETURN @Res
END
GO

INSERT INTO Test (Oper, Lft, Rgt)
SELECT 'ADD', 2, 8
UNION ALL SELECT 'MUL', 2, 8

select *, dbo.F_MY_OPER(Oper, Lft, Rgt) from Test

2+8 должно отличаться от 2*8 полюбому
30 мар 04, 15:54    [604134]     Ответить | Цитировать Сообщить модератору
 Re: Запуск сторенной процедуры из функции  [new]
Valeriy Hudym
Member

Откуда: Киев
Сообщений: 10
Ну, наконец (спасибо тебе, Sargos :-) удалось запустить экзецом из функции функцию, "склеиную" из частей ....
а вот возможно ли "склеить" и запустить запрос типа
"SELECT SUM(AMOUNT) FROM " + @table_pref + "_SUFIX"
непосредственно в функции?
30 мар 04, 17:17    [604396]     Ответить | Цитировать Сообщить модератору
 Re: Запуск сторенной процедуры из функции  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Ни где явно не написано, что разрешено использовать динамические запросы внутри UDF, правда так же не написано что нельзя 8(
Однако от обратного, можно понять, что хранимые процедуры вызывать нельзя, а sp_executesql как раз хранимая процедура, так что упс.

Заготовьте зараз функций на усе случаи :)
30 мар 04, 17:55    [604490]     Ответить | Цитировать Сообщить модератору
 Re: Запуск сторенной процедуры из функции  [new]
Valeriy Hudym
Member

Откуда: Киев
Сообщений: 10
на все случаи заготовлять не очень то хорошо ;-(
таких случаев будет 5 функций, 5 критериев отбора и 5 условий группировок, итого 5*5*5 = ?-(
30 мар 04, 18:19    [604534]     Ответить | Цитировать Сообщить модератору
 Re: Запуск сторенной процедуры из функции  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Итого получаем 5 функций по 2 управляющих параметра у каждой
и в каждой функции максимум 5*5=25 вариантов выборки,
если не получается собрать сложное условие.
Про переменные группировки тоже что-то недавно было, а если не поможет,
то всего то 5 вариантов, руки не отвалятся писать IF ELSE IF...
30 мар 04, 18:29    [604552]     Ответить | Цитировать Сообщить модератору
 Re: Запуск сторенной процедуры из функции  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
2Sargos
не, ну все-таки это-ж вызов функции, а не процедуры...
вроде-как в BOL написано что из UDF можно вызывать или UDF или XP... но чтобы таким интересным способом.... правда, если разобраться, то в том же BOL такое описано....
так-шта... не очень пригождается... хотя интересно, спасибо за пример
30 мар 04, 19:57    [604664]     Ответить | Цитировать Сообщить модератору
 Re: Запуск сторенной процедуры из функции  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Похоже, что ограничениями на вызов ведает исполнительная подсистема, а компиляция того же EXEC приводит к получению различного исполняемого кода, в зависимости от контекста. Так шо написано в BOL -можно UDF inside UDF, значит можно, а как похоже наши проблемы :)
31 мар 04, 08:56    [604989]     Ответить | Цитировать Сообщить модератору
 Re: Запуск сторенной процедуры из функции  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну до чего ж народ у нас любит связываться со всяким геммороем. Вон какую фигатень понавыдумывали!

А не стоит ли подумать о разработке 3-х звенной архитектуры?...
31 мар 04, 09:57    [605092]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить