Недопустимое использование оператора с побочным действием

als-a Откуда: | Не пойму что не так (ногами не бейте вчера MsSql Server 2005 Rus поставил) в Microsoft SQL Server Management Studio (9.00.2047.00) пытаюсь создать фунцию вот текст — ================================================ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO — ============================================= CREATE FUNCTION GET_ID ( — Add the parameters for the function here ) RETURNS int AS BEGIN DECLARE @a int, @ID_COUNT_0 int Select @ID_COUNT_0=ID_COUNT_0 from dbo.Counters Set @a=@ID_COUNT_0 Set @ID_COUNT_0=@ID_COUNT_0+1 Update dbo.Counters set ID_COUNT_0 = @ID_COUNT_0 END Сообщение 443, уровень 16, состояние 15, процедура GET_ID, строка 17 Таблица dbo.Counters состоит из одного столбца int в ней одна запись где ID_COUNT_0=1 |
daw Откуда: Муром -> Москва | в функциях запрещены dml операторы над постоянными таблицами. Posted via ActualForum NNTP Server 1.4 |
Glory Откуда: |
А что непонятного в сообщении |
als-a Откуда: | а процедуры ? |
Glory Откуда: | Двести |
daw Откуда: Муром -> Москва | >а процедуры ? в процедурах – можно. но процедуры нельзя напрямую в запросах использовать. Posted via ActualForum NNTP Server 1.4 |
daw Откуда: Муром -> Москва | >а процедуры ? или вы в смысле – вызывать процедуры в функциях? Posted via ActualForum NNTP Server 1.4 |
als-a Откуда: | То есть запихнуть Update в процедуру и вызвать процедуру из функции тоже не прокатит ? |
проходящий. Guest |
Ничего не знаю, ничего не понимаю, но первое что сделаю – свой генератор последовательностей. |
Glory Откуда: |
Можно один раз открыть в хелпе перечень ограничений udf-ов и узнать о них всех сразу |
pkarklin Откуда: Москва (Муром) |
ну и делайте на основе процедуры. |
als-a Откуда: | Ну по поводу Ничего не знаю, ни чего не понимаю: Я более 10 лет работал с Oracle. а по поводу но первое что сделаю – свой генератор последовательностей. Без него ж никак! : на чем-то надо ж эксперементы проводить… Кстати в Oracle в фунции можно писать что угодно, чего-то парни из Microsoft не додумали … |
Гавриленко Сергей Алексеевич Откуда: Moscow |
У вас два варианта: или отвыкать от того, к чему вы привыкли на оракле, или писать дальше на оракле. |
pkarklin Откуда: Москва (Муром) |
М.б. свойством IDENTITY(1, 1) обойдетесь?! |
als-a Откуда: | да обойтись можно то можно а как же эксперименты ? |
Glory Откуда: |
После 10лет работы с Oracle это скорее будут не эксперименты, а попытки эмулировать Oracle на MSSQL |
pkarklin Откуда: Москва (Муром) |
О каких экспериментах идет речь?! Попытка реализовать на MS SQL Oracle? |
als-a Откуда: |
В другое место ушел работать, на Oracle золотого запаса здесь не хватает. Тут базы под акцесом сделаны, так то это не очень хорошо … Так что надо потихонечку мигрировать куда – нибудь, похоже на MS SQL Server ….. |
als-a Откуда: | да и под нарезанные задачи – Oracle все равно что из пушки по воробьям … |
pkarklin Откуда: Москва (Муром) |
Тогда резко забываем об Oracle и осваиваем “парадигму” MS SQL. 😉 |
tpg Откуда: Novosibirsk |
С чего это вы решили, что не додумали? Половина команды разработки сиквела – это аккурат бывшие разработчики оракла. Видимо таким образом они решили отказаться от тупиковых путей (перейдя в MS) 😉 |
SQLMantis Откуда: Москва | Если бы подобное было разрешено, что вернул бы запрос: select GET_ID, ID_COUNT_0 from dbo.Counters ? |
Ссылка на сообщение
Ссылка (включая название темы)
Ссылка (URL)
x
Источник
Multy Откуда: | Пытаемся создать функцию типа Create FUNCTION dbo.Ins ( @Pr1 Int, @Pr2 Int ) RETURNS @Rez1 TABLE ( Rez1 Int, Rez2 Int ) AS BEGIN insert into dbo.Rez(Rez1,Rez2) Values(@Pr1,@Pr2) insert into @Rez Values(1,1) RETURN END Получаем ошибку: Сообщение 443, уровень 16, состояние 15, процедура Insert, строка 13 Недопустимое использование оператора “INS”, оказывающего побочное действие, в функции. Это можно как-нибудь обойти или отключить? Alter Procedure dbo.Ins ( @Pr1 Int, @Pr2 Int ) AS BEGIN insert into dbo.Rez(Rez1,Rez2) Values(@Pr1,@Pr2) Select * from dbo.Rez END Или инсерты взможны только в процедурах? |
Nailbomb Guest | в функциях инсерты делать нельзя |
Multy Откуда: |
Это они не доработали, или скорее переработали… |
Гавриленко Сергей Алексеевич Откуда: Moscow |
Да нет, это просто кто-то хелп не дочитал. |
Козьма Прутков Откуда: Москва | Multy, а точно надо писать dbo.Rez а не @Rez1? В результирующую таблицу инсенртить можно, а в остальные – нет. Create FUNCTION dbo.Ins |
Multy Откуда: |
В результирующию то понятно, смысл был как раз в побочную таблицу. |
Козьма Прутков Откуда: Москва | Multy, а что за задача такая, при которой надо что-то менять в обычных таблицах? Уж не генератор ли каких номеров, или упаси бог ключей, вы пытаетесь написать? |
проходящий. Guest |
И есть достаточное обоснование такой надобности? Можно его глянуть? |
Пятница_13 Guest | Козьма Прутков, А вот тут подробнее ! Про ключи особенно. |
Aleksey-K Откуда: Москва |
Это не совсем верная информация. |
Козьма Прутков Откуда: Москва | Aleksey-K, ладно уж придираться-то, я оперирую в терминах вопроса, а не пытаюсь пересказать BOL 🙂 |
Козьма Прутков Откуда: Москва |
Даже не знаю, что ответить. Может, лучше вопрос переформулировать? Есть просто любители писать генераторы ключей, 99% которых просто не знают, как воспользоваться уже имеющимися возможностями MSSQL, или возможностями технологии разработки кода, который работает с БД. Поскольку любителей таких много – потому сразу и спрашиваю. |
Пятница_13 Guest |
Да, надо признать – я один из тех. А может просто привычка после Firebird-а и Oracle-а. |
Козьма Прутков Откуда: Москва | Пятница_13, не вижу смысла своими словами рассказывать, почитайте в BOL про identity, @@identity, scope_identity(). А также uniqueidentifier, newid() если хочется глобальной уникальности при невысокой производительности. Будут конкретные вопросы – задавайте уже их. |
Пятница_13 Guest | Козьма Прутков, Предлагаете изменить привычкам ? |
Glory Откуда: |
Непривычно == некрасиво ? Красивость мереется по длине кода ? |
Пятница_13 Guest |
В т.ч. и по длине кода )) |
Ссылка на сообщение
Ссылка (включая название темы)
Ссылка (URL)
x
Источник
ValGer Откуда: Псков | Казалось бы тривиальная задачка. Хочу создать функцию, которая бы выдавала наружу код новой записи в таблице. Код автоинкрементный, с шагом +1. Это достигается чтением @@IDENTITY после создания новой строки. Пишу функцию (в студии SQL 2008 R2): ALTER FUNCTION [dbo].[НомерНовогоРаботника] INSERT INTO dbo.MAIN RETURN @@IDENTITY Проверка синтаксиса в студии говорит, что всё хорошо, но как только пытаюсь выполнить (то есть записать эту функцию в базу – ALTER) выдаётся странная ошибка: Сообщение 443, уровень 16, состояние 15, процедура НомерНовогоРаботника, строка 7 Проверил отдельно INSERT – всё прекрасно вставляется. |
locky Откуда: Харьков, Украина |
это означает ровно то, что написано – “нельзя использовать insert в функции” – равно как и еще некоторый набор стейтментов |
iap Откуда: Москва | ValGer, из UDF нельзя менять данные в постоянных и временных таблицах. |
ValGer Откуда: Псков | locky, Спасибо, просветили! Читая книжки, наверно, пропустил. |
locky Откуда: Харьков, Украина |
Топ 10, вопрос №4 |
ValGer Откуда: Псков | iap, Здесь я побывал, но нигде членораздельные слова о том, что INSERT нельзя использовать в функциях не встретил. А сообщение очень завуалированное – спасибо просветили. |
Ennor Tiegael Откуда: | ValGer, На самом деле, insert использовать в функциях можно, но только с табличными переменными (они пока по определению локальны). Общее же правило – выполнение функции не должно приводить к изменению чего-либо за ее пределами – сформулировано в доке довольно четко. |
locky Откуда: Харьков, Украина |
https://msdn.microsoft.com/ru-ru/library/ms186755(v=sql.100).aspx разделы “Совместимость” и “Ограничения” https://msdn.microsoft.com/ru-ru/library/ms191320(v=sql.100).aspx раздел “Рекомендации”: “Изменения таблиц баз данных, операции с курсорами, не являющимися локальными для данной функции, отправка электронной почты, попытка изменения каталога, формирование результирующего набора, возвращаемого пользователю — это примеры действий, выполнение которых внутри функции невозможно.” |
SIMPLicity_ Откуда: (((@))) | Перепишите на хранимую процедуру,- проблем со вставкой не будет. первой строкой set nocount on в последней – select @NewId (который у Вас @@identity) |
Ссылка на сообщение
Ссылка (включая название темы)
Ссылка (URL)
x
Источник
MsGuns Откуда: г.Чернигов | Вот функция: USE [TelBook] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER FUNCTION [dbo].[UsF_Test] ( @FieldName sysname, — Имя поля, по которому делать фильтрацию (where) @FieldValue varchar(max), — Значение для фильтрации @FieldSort sysname, — Имя поля для сортировки (order by) @Nlist int, — Номер листа, который требуется вернуть @QRows int — Кол-во строк на листе ) RETURNS @RetTable TABLE ( FIO_ID int, FIO_FAM varchar(255), FIO_Name [varchar](255), FIO_SName [varchar](255), FIO_RoomNo [varchar](8), FIO_PersAdrs [varchar](1024) NULL, FIO_Pos [int] NULL, FIO_OUT [varchar](4) NULL, FIO_DateOUT [date] NULL, FIO_DEP [int] NULL, FIO_MI [int] NULL, FIO_Mo [int] NULL, FIO_OP [int] NULL, FIO_RG [int] NULL, FIO_UPR [int] NULL, FIO_SUB [int] NULL, FIO_Res1 [varchar](1024) NULL, FIO_Res2 [varchar](16) NULL, FIO_Res3 [varchar](16) NULL, FIO_Res4 [varchar](16) NULL ) AS При попытке записать UDF на сервер выдает Сообщение 443, уровень 16, состояние 14, процедура UsF_Test, строка 41 Что делать ? Спасибо за помощь |
MsGuns Откуда: г.Чернигов |
А в UDF никак ? |
MsGuns Откуда: г.Чернигов |
Спасибо. |
vikkiv Откуда: London | MsGuns, Exec/SP в функции не вставляется, (за искл. специальных), ну или CLR тогда Сообщение было отредактировано: 4 янв 20, 18:15 |
Владислав Колосов Откуда: | MsGuns, такие вещи недопустимо использовать в принципе при разработке для бизнеса. |
MsGuns Откуда: г.Чернигов |
А почему собственно ? Этот динамический запрос выполняется сугубо на сервере, доступа к хранимке со стороны клиента отсутствует в принципе ибо трехзвенка (ASP.NET MVC). Что тут противоречит принципам “разработок для бизнеса” ? |
stenford Откуда: урал |
потому-что динамический sql, где поля и данные подставляются произвольно – это самоубийство безопасности, тут не только данные можно выгрести какие угодно, но еще саму базу дропнуть |
Ссылка на сообщение
Ссылка (включая название темы)
Ссылка (URL)
x
Источник