Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Неужели нельзя выполнить DML в функции  [new]
Богратов Олег
Guest
Люди добрые, ну как же так что делать, именно надо функция, и в ней надо удалять записи, неужели только через процедуру. Или есть какой способ
22 июл 04, 11:18    [826724]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37100
Богратов Олег
Люди добрые, ну как же так что делать, именно надо функция, и в ней надо удалять записи, неужели только через процедуру. Или есть какой способ

А что э за логика(задача) такая, что удалять надо именно в функции?
22 июл 04, 11:20    [826736]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
Богратов Олег
Guest
Ну
например так

CREATE FUNCTION VVV()
RETURNS NUMERIC
AS
BEGIN
INSERT INTO AAA (N) VALUES (1)
RETURN 1
END

Именно функция, не процедура нада (это простой пример, там будет возращать результат расчета еще)
22 июл 04, 11:22    [826744]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37100
Богратов Олег
Ну
например так

CREATE FUNCTION VVV()
RETURNS NUMERIC
AS
BEGIN
INSERT INTO AAA (N) VALUES (1)
RETURN 1
END

Именно функция, не процедура нада (это простой пример, там будет возращать результат расчета еще)

В функции не выйдет - в BOL четко сказано.
Почему нельзя использовать хп?
22 июл 04, 11:26    [826765]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Богратов Олег
Именно функция, не процедура нада (это простой пример, там будет возращать результат расчета еще)

А что, есть уверенность, что ХП не умеет возвращать рекордсет?
22 июл 04, 11:29    [826775]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
Богратов Олег
Guest
Именно функция должна быть, раньше были процедуры, сказали надо функции..
Точно нельзя или можно как нить... Подскажите ПЛЗ
22 июл 04, 11:30    [826779]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
В функции можно выполнять INSERT, UPDATE, DELETE только для табличных переменных. Для нормальных таблиц нельзя. Пишите процедуру.

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

select dbo.func1 (id) from t1

А в функции вы, к примеру, будете удалять строки из таблицы t1, id которых приходит в функцию. Представляете себе бред, который получится?

Пишите процедуру, которая и модифицирует данные, и возвращает рекордсет. В чем проблема?
22 июл 04, 11:31    [826791]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
Точно нельзя или можно как нить...
Точнее не бывает. Откройте офоициальную документацию и прочитайте.

ЗЫ
А где аргументы что "Именно функция должна быть" ? И почему "сказали надо функции.." ?
22 июл 04, 11:32    [826794]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Богратов Олег
Именно функция должна быть, раньше были процедуры, сказали надо функции..
Точно нельзя или можно как нить... Подскажите ПЛЗ

Говорят же - нет, значит - нет. BOL
22 июл 04, 11:32    [826797]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
Шотов Вадим
Member

Откуда: Киев
Сообщений: 309
Можно через openquery() но там много ограничений...
Намного лучше через процедуру.
22 июл 04, 11:32    [826799]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37100
Богратов Олег
Именно функция должна быть, раньше были процедуры, сказали надо функции..

Кто сказал?
[quot Богратов Олег]
Точно нельзя или можно как нить... Подскажите ПЛЗ
А можно молотком отвинтить шуруп?
Написано же, почти русским по белому:

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:

Assignment statements.

Control-of-Flow statements.

DECLARE statements defining data variables and cursors that are local to the function.

SELECT statements containing select lists with expressions that assign values to variables that are local to the function.

Cursor operations referencing local cursors that are declared, opened, closed, and deallocated in the function. Only FETCH statements that assign values to local variables using the INTO clause are allowed; FETCH statements that return data to the client are not allowed.

INSERT, UPDATE, and DELETE statements modifying table variables local to the function.

EXECUTE statements calling an extended stored procedures.
22 июл 04, 11:33    [826801]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
Богратов Олег
Guest
SELECT statements containing select lists with expressions that assign values to variables that are local to the function.

Cursor operations referencing local cursors that are declared, opened, closed, and deallocated in the function. Only FETCH statements that assign values to local variables using the INTO clause are allowed; FETCH statements that return data to the client are not allowed.

INSERT, UPDATE, and DELETE statements modifying table variables local to the function.

EXECUTE statements calling an extended stored procedures.


Так что значит можно???
22 июл 04, 11:38    [826841]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
INSERT, UPDATE, and DELETE statements modifying table variables local to the function.
22 июл 04, 11:38    [826845]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
Богратов Олег
Guest
А.... так это только значит в локальной таблица а не в БД??

Значит, сказать что не получится так...
22 июл 04, 11:39    [826852]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
Glory
Member

Откуда:
Сообщений: 104760
Да не в локальной таблице, а в локальной переменной типа table, объявленной в теле самой UDF
22 июл 04, 11:40    [826859]     Ответить | Цитировать Сообщить модератору
 Re: Неужели нельзя выполнить DML в функции  [new]
Богратов Олег
Guest
Спасибо
22 июл 04, 11:44    [826882]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить