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

Откуда:
Сообщений: 574
Добрый день всем!
Пытаюсь из пользовательской функции вставить записи в таблицу базы, при сохранении её выдаётся ошибка:
Invalid use of side-effecting or time-dependent operator in 'INSERT' within a function
Мне это нужно, потому что переменные типа table в это функции, при использовании её в запросе(она там много раз вызывается), вызывают зависание выполнения.
Что делать?
11 июн 14, 10:07    [16152662]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Джек
Мне это нужно, потому что переменные типа table в это функции, при использовании её в запросе(она там много раз вызывается), вызывают зависание выполнения.
Что делать?

Написать функцию так, чтобы не было зависаний
11 июн 14, 10:11    [16152681]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
Джек
Добрый день всем!
Пытаюсь из пользовательской функции вставить записи в таблицу базы, при сохранении её выдаётся ошибка:
Invalid use of side-effecting or time-dependent operator in 'INSERT' within a function
Мне это нужно, потому что переменные типа table в это функции, при использовании её в запросе(она там много раз вызывается), вызывают зависание выполнения.
Что делать?
Например, почитать документацию на предмет существующих ограничений для пользовательских функций.
тынц
11 июн 14, 10:35    [16152817]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
Джек
Member

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

Я поэтому и хочу в функции вместо локальных переменных типа table, собирать данные в базовые таблицы.
11 июн 14, 12:10    [16153663]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Джек
Я поэтому и хочу в функции вместо локальных переменных типа table

А придется все равно написать нормально работающую функцию.
11 июн 14, 12:12    [16153674]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
Джек
и хочу
Если нельзя, но очень хочется, то можно, да?
11 июн 14, 12:12    [16153677]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
Джек
Glory,

Я поэтому и хочу в функции вместо локальных переменных типа table, собирать данные в базовые таблицы.
Цитата из документации по приведенной ссылке:
Modifications to database tables, operations on cursors that are not local to the function, sending e-mail, attempting a catalog modification, and generating a result set that is returned to the user are examples of actions that cannot be performed in a function.


Если "очень хочется", то вместо функции используйте хранимую процедуру - и будет Вам счастье.
11 июн 14, 13:48    [16154396]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
sphinx_mv
Джек
Glory,

Я поэтому и хочу в функции вместо локальных переменных типа table, собирать данные в базовые таблицы.
Цитата из документации по приведенной ссылке:
Modifications to database tables, operations on cursors that are not local to the function, sending e-mail, attempting a catalog modification, and generating a result set that is returned to the user are examples of actions that cannot be performed in a function.


Если "очень хочется", то вместо функции используйте хранимую процедуру - и будет Вам счастье.
Если учить плохому, то можно и из функции...
Но не буду оказывать медвежью услугу
11 июн 14, 13:57    [16154458]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
Джек
Member

Откуда:
Сообщений: 574
sphinx_mv,
спасибо за ответ, но мне нужно в запросе возвращать значение в поле выборки, а процедурой так не сделать.
11 июн 14, 14:04    [16154522]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Джек
, но мне нужно в запросе возвращать значение в поле выборки

Тогда зачем вам INSERT да еще в другую таблицу ?
11 июн 14, 14:05    [16154531]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
Джек
Member

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

у меня вот такой, примерно, запрос:
select
...
(select top1 f from myfunction(...) ) as pn
...
from mytable

в алгоритме myfunction не удалось(не хватает ума у меня) одним запросом набор сделать, поэтому создаются разные таблицы(переменные типа table) и в конце из них собирается выходной набор.
Дак вот, когда один раз вызывается myfunction(...) она работает 1 секунду, а может и меньше, но в запрос с ней повисает, и видимо из-за этих локальных переменных таблиц, поскольку на них не ведётся статистика(нет плана запросов). Вот я и решил создать промежуточные наборы в базовых или временных таблицах(их в одной сессии видно). Но ни то, не другое sql мне сделать не даёт.
11 июн 14, 14:56    [16154991]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Джек
Но ни то, не другое sql мне сделать не даёт.

может вы приведете здесь текст myfunction(...) в том виде как он есть ? И вам быстрее помомуг написать нормальный запрос
11 июн 14, 15:16    [16155202]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
iap
Member

Откуда: Москва
Сообщений: 47194
Джек,

хотя бы индексы у функции догадались сделать?
11 июн 14, 15:19    [16155229]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
sphinx_mv
Member [заблокирован]

Откуда:
Сообщений: 1672
Джек
sphinx_mv,
спасибо за ответ, но мне нужно в запросе возвращать значение в поле выборки, а процедурой так не сделать.

И что Вам мешает выполнить запрос (и даже не один) внутри хранимой процедуры? Получите

Смотрите тут "Creating a simple Transact-SQL procedure".
11 июн 14, 16:17    [16155805]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
Джек
в алгоритме myfunction не удалось(не хватает ума у меня) одним запросом набор сделать, поэтому создаются разные таблицы(переменные типа table) и в конце из них собирается выходной набор.

И вы думаете, что что-то поменяется, если вместо табличных переменных вы будете добавлять записи в постоянные таблицы ?
11 июн 14, 17:03    [16156154]     Ответить | Цитировать Сообщить модератору
 Re: Как обновить таблицу базы данных из пользовательской функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6727
Джек
в алгоритме myfunction не удалось(не хватает ума у меня) одним запросом набор сделать
Ну и логика блин: я тут кое что не умею, но это не важно для решения задач.

Возьмите и научитесь.
Джек
повисает, и видимо из-за этих локальных переменных таблиц, поскольку на них не ведётся статистика
И с каких пор, будучи неучем, вы делаете такие скоропостижные выводы?

Вы вместо того чтобы научится, пытаетесь всеми способами вставить кубик в круглое отверстие.
И не важно что в голову приходят такие нелепости, противоречащие базовым основам скуля?!

Или учиться или вам сюда.

А теперь что у вас там не получается написать в одном запросе?
А может лень переписать код?
13 июн 14, 02:01    [16160393]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить