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

Откуда:
Сообщений: 129
Дано:

Есть процедура Procedure, она что-то делает внутри себя и, самое главное, заполняет таблицу Table на сервере.
Есть функция Function, которая в теле тянет данные из Table. Т.е. Procedure нужно вызывать перед Function.
Поэтому я написал функцию-обертку FunctionWrapper

FunctionWrapper 
{
    Procedure
    Function
}


Тут и начались проблемы. Проблема номер 1.

Функцию FunctionWrapper может одновременно вызвать несколько пользователей. Т.е. данные в таблице Table будут перемешаны, ими нельзя будет пользоваться в функции Function. Я почитал про временные таблицы и решил сделать таблицу Table временной, чтобы у каждого пользователя была своя таблица. Однако, компилятор ругается, что внутри Function нельзя обращаться к временным таблицам.

Я временно плюнул на временные таблицы и многопользовательность и решил пока обойтись константной обычной таблицей. С Function проблема пропала, зато теперь ругается FunctionWrapper , а именно
автор
Внутри функции можно вызывать только функции и некоторые расширенные хранимые процедуры.


Как же мне организовать вызов процедуры и функции с учетом многопользовательности?
18 ноя 14, 16:41    [16866638]     Ответить | Цитировать Сообщить модератору
 Re: Организация вызова функций и процедур  [new]
_djХомяГ
Guest
Ну так заполняете временную таблицу результатом вызова ф-ции , а не обращайтесь к таблице в теле самой ф-ции
Или используйте табличные переменные
18 ноя 14, 16:45    [16866669]     Ответить | Цитировать Сообщить модератору
 Re: Организация вызова функций и процедур  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4804
monstrilla
Однако, компилятор ругается, что внутри Function нельзя обращаться к временным таблицам.


1) Вы можете использовать переменную типа таблицу в функции.
2) Я бы вам рекомендовал сделать RTFM по уровням изоляции транзакций, прежде чем что-то вообще писать, чтобы вы понимали, а как это вообще правильно написать

Я не пойму, это вообще на каком языке? На браинфаке или на архихаке?
FunctionWrapper 
{
    Procedure
    Function
}
18 ноя 14, 16:47    [16866689]     Ответить | Цитировать Сообщить модератору
 Re: Организация вызова функций и процедур  [new]
_djХомяГ
Guest
К слову, если FunctionWrapper таки фунция , как можно вызвать оттуда процедуру
18 ноя 14, 16:49    [16866716]     Ответить | Цитировать Сообщить модератору
 Re: Организация вызова функций и процедур  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Перепишите процедуру так, чтобы она использовала функцию.
18 ноя 14, 17:01    [16866833]     Ответить | Цитировать Сообщить модератору
 Re: Организация вызова функций и процедур  [new]
Maxx
Member [скрыт]

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

начинайте думать как скл-щик А то у вас подход неправильный к работе с данными
18 ноя 14, 17:07    [16866925]     Ответить | Цитировать Сообщить модератору
 Re: Организация вызова функций и процедур  [new]
monstrilla
Member

Откуда:
Сообщений: 129
Владислав Колосов
_djХомяГ

не понял вас. какие таблицы, какие функции. я специально имена дал в вопросе, чтоб можно было обращаться к ним. если можно поподробнее, плз.

попутно спрошу.

1) Формирую внутри функции текст запроса.
2) Выполняю запрос через EXEC sp_executesql ТекстЗапроса;

Как мне вернуть из функции результат запроса? Пытался так

insert into @result EXEC sp_executesql @selectCommand;
, где @result - возвращаемая функцией таблица - не пропускает компил
автор
Недопустимое использование оператора "INSERT EXEC", оказывающего побочное действие, в функции.
18 ноя 14, 17:25    [16867119]     Ответить | Цитировать Сообщить модератору
 Re: Организация вызова функций и процедур  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
1) Формирую внутри функции текст запроса.
2) Выполняю запрос через EXEC sp_executesql ТекстЗапроса;


Вы уверены, что запросы необходимо именно так писать?
18 ноя 14, 17:33    [16867214]     Ответить | Цитировать Сообщить модератору
 Re: Организация вызова функций и процедур  [new]
Glory
Member

Откуда:
Сообщений: 104760
monstrilla
1) Формирую внутри функции текст запроса.
2) Выполняю запрос через EXEC sp_executesql ТекстЗапроса;

Как мне вернуть из функции результат запроса?

Для начала лучше читать в хелпе про ограничения того или иного объекта
То, что вы хотите в функции сделать нельзя
О чем вам сервер и сообщил
18 ноя 14, 17:35    [16867223]     Ответить | Цитировать Сообщить модератору
 Re: Организация вызова функций и процедур  [new]
monstrilla
Member

Откуда:
Сообщений: 129
Glory, вопрос в том, как вернуть, что нельзя я и так вижу. знающие люди посоветовали переделать функцию на ХП

Владислав Колосов, передо мной сейчас поставлена именно такая задача, выбирать не приходится.
18 ноя 14, 17:52    [16867357]     Ответить | Цитировать Сообщить модератору
 Re: Организация вызова функций и процедур  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
monstrilla, ни функциями такого рода, ни обертками, ни динамическими запросами хороший T-SQL код не пишется.
18 ноя 14, 18:04    [16867445]     Ответить | Цитировать Сообщить модератору
 Re: Организация вызова функций и процедур  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
monstrilla
Glory, вопрос в том, как вернуть, что нельзя я и так вижу. знающие люди посоветовали переделать функцию на ХП

Владислав Колосов, передо мной сейчас поставлена именно такая задача, выбирать не приходится.
если вы уже говорите о ХП а не о функции то как вернуть уже не вопрос
в ХП insert...exec вполне себе работает

вы попробуйте лучше изложить исходную задачу котрую вы пытаетесь решить таким извращенным способом
скорее всего там все проще решается
18 ноя 14, 18:17    [16867519]     Ответить | Цитировать Сообщить модератору
 Re: Организация вызова функций и процедур  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31430
monstrilla
передо мной сейчас поставлена именно такая задача, выбирать не приходится.
Задачи ставит человек, вообще не разбирающийся в сиквеле, человеку, который уже узнал про существование функций и процедур? :-)

Вам говорят - не надо использовать динамический SQL, не надо делать вложенные процедуры и особенно функции, пока не появится опыт.

Пишите пока просто запросы в хранимых процедурах, вызываемых из клиента, без вложенностей, так хоть начальные знания появятся.
18 ноя 14, 18:50    [16867684]     Ответить | Цитировать Сообщить модератору
 Re: Организация вызова функций и процедур  [new]
Glory
Member

Откуда:
Сообщений: 104760
monstrilla
Glory, вопрос в том, как вернуть, что нельзя я и так вижу. знающие люди посоветовали переделать функцию на ХП

Вы не то и не на то переделываете.
18 ноя 14, 20:53    [16868323]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить