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

Откуда: Псков
Сообщений: 468
Казалось бы тривиальная задачка.
Хочу создать функцию, которая бы выдавала наружу код новой записи в таблице. Код автоинкрементный, с шагом +1. Это достигается чтением @@IDENTITY после создания новой строки. Пишу функцию (в студии SQL 2008 R2):

ALTER FUNCTION [dbo].[НомерНовогоРаботника]
(
)
RETURNS numeric
AS
BEGIN

INSERT INTO dbo.MAIN
(НомерРайона, НомерРегиона, КодШколы, Фамилия, ИмяОтчество,
Пол, ДатаРождения, ОсновнаяДолжность)
VALUES
(1, 60, 1, 'Анекто', 'Некто Нектович', 'Ж', '01.01.1990', 8)

RETURN @@IDENTITY
END

Проверка синтаксиса в студии говорит, что всё хорошо, но как только пытаюсь выполнить (то есть записать эту функцию в базу - ALTER) выдаётся странная ошибка:

Сообщение 443, уровень 16, состояние 15, процедура НомерНовогоРаботника, строка 7
Недопустимое использование оператора "INSERT", оказывающего побочное действие, в функции
.

Проверил отдельно INSERT - всё прекрасно вставляется.
Что это может означать?
7 апр 13, 18:53    [14147881]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании T-SQL функции  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
ValGer
Что это может означать?

это означает ровно то, что написано - "нельзя использовать insert в функции" - равно как и еще некоторый набор стейтментов
это прекрасно описано в BOL в разделе по созданию UDF
7 апр 13, 18:55    [14147894]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании T-SQL функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
ValGer,

из UDF нельзя менять данные в постоянных и временных таблицах.
7 апр 13, 18:59    [14147912]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании T-SQL функции  [new]
ValGer
Member

Откуда: Псков
Сообщений: 468
locky,

Спасибо, просветили! Читая книжки, наверно, пропустил.
Видимо, в процедуре можно?
Кстати что такое BOL? Дайте ссылочку.
С уважением ...
7 апр 13, 19:00    [14147916]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании T-SQL функции  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
ValGer
locky,

Спасибо, просветили! Читая книжки, наверно, пропустил.
Видимо, в процедуре можно?
Кстати что такое BOL? Дайте ссылочку.
С уважением ...


Топ 10, вопрос №4
7 апр 13, 19:01    [14147921]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании T-SQL функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
ValGer
Кстати что такое BOL? Дайте ссылочку.
Я обычно стартую здесь: http://msdn.microsoft.com/ru-ru/library/bb510741(v=sql.100).aspx
7 апр 13, 19:06    [14147951]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании T-SQL функции  [new]
ValGer
Member

Откуда: Псков
Сообщений: 468
iap,

Здесь я побывал, но нигде членораздельные слова о том, что INSERT нельзя использовать в функциях не встретил. А сообщение очень завуалированное - спасибо просветили.
7 апр 13, 19:18    [14147993]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании T-SQL функции  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
ValGer,

На самом деле, insert использовать в функциях можно, но только с табличными переменными (они пока по определению локальны).

Общее же правило - выполнение функции не должно приводить к изменению чего-либо за ее пределами - сформулировано в доке довольно четко.
7 апр 13, 19:42    [14148063]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании T-SQL функции  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
ValGer
iap,

Здесь я побывал, но нигде членораздельные слова о том, что INSERT нельзя использовать в функциях не встретил. А сообщение очень завуалированное - спасибо просветили.


http://msdn.microsoft.com/ru-ru/library/ms186755(v=sql.100).aspx

разделы "Совместимость" и "Ограничения"

http://msdn.microsoft.com/ru-ru/library/ms191320(v=sql.100).aspx

раздел "Рекомендации": "Изменения таблиц баз данных, операции с курсорами, не являющимися локальными для данной функции, отправка электронной почты, попытка изменения каталога, формирование результирующего набора, возвращаемого пользователю — это примеры действий, выполнение которых внутри функции невозможно."
7 апр 13, 20:15    [14148162]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка при создании T-SQL функции  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8725
Перепишите на хранимую процедуру,- проблем со вставкой не будет.
первой строкой set nocount on
в последней - select @NewId (который у Вас @@identity)
8 апр 13, 00:03    [14148928]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить