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

Откуда:
Сообщений: 33
И вновь здравствуйте

Суть проблемы такова: нужно сделать так, чтобы процедура, вызвавшая функцию, узнала насколько успешно (или неуспешно) выполнилась функция (то есть не встретила ли она каких-либо несоотвтетсвий в переданом наборе данных и т.д., желательно в формате int), а затем управляющая процедура по этому результату и имени функции вытащила из таблицы соответствующее сообщение, в то время как сама функция обычно возвращает таблицу, строку или другое важное значение в которое втиснуть код результата исполнения врядли получится.

Вторая часть вроде как сделана и работает на тех функциях и процедурах, которые возвращают int. Но как быть с табличными и остальными скалярными функциями?

P.S. Функция не может писать даже в CONTEXT_INFO (
P.P.S У меня все больше складывается впечатление что функции в T-SQL по своим возможностям какие-то огрызки в сравнении с процедурами T-SQL и функциями в других языках программирования.
21 фев 13, 13:42    [13960742]     Ответить | Цитировать Сообщить модератору
 Re: Вывод дополнительных значений из User Defined Function  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
euthanatos
нужно сделать так, чтобы процедура, вызвавшая функцию, узнала насколько успешно (или неуспешно) выполнилась функция
речь про исключения (exceptions) ?
21 фев 13, 13:43    [13960754]     Ответить | Цитировать Сообщить модератору
 Re: Вывод дополнительных значений из User Defined Function  [new]
euthanatos
Member

Откуда:
Сообщений: 33
Не уверен, так как я никогда не работал с исключениями в MSSQL

Я объясню проще, по детски:
Есть допустим фунция, которая проверяет наличие определенных привелегий у пользователя, и возвращает int
1 - если есть необходимая привелегия
0 - если её нет
-1 - если указанного пользователя нет в списках
-2 - если обработчика для проверки указанной привелегии нет в функции
... ну и так далее. Процедура, которая вызвала функцию, смотрит на результат, и если он нехороший - то выдает определённый ранее заготовленный текст по ошибке из специальной таблицы. В общем главная процедура всегда знает, все ли прошло успешно и если нет, то почему. Всё замечательно.

И есть другая функция, которая например делает в своём теле SELECT с условиями и возвращает результат ввиде таблицы назад в процедуру. Функция отработает независимо от того, какую чушь там указали в переданных параметрах и что печально - пользователь даже не узнает, что результат на самом деле ошибочный и будет думать что все в порядке.

Соответственно по доброму этим функциям тоже надо дать средство как-нибудь ругаться наружу, вопрос как это реализовать?
21 фев 13, 14:04    [13960969]     Ответить | Цитировать Сообщить модератору
 Re: Вывод дополнительных значений из User Defined Function  [new]
Гость333
Member

Откуда:
Сообщений: 3683
euthanatos
Функция отработает независимо от того, какую чушь там указали в переданных параметрах

Проверяйте входные параметры в хранимой процедуре. И ругайтесь наружу из неё.
21 фев 13, 14:10    [13961026]     Ответить | Цитировать Сообщить модератору
 Re: Вывод дополнительных значений из User Defined Function  [new]
Glory
Member

Откуда:
Сообщений: 104751
euthanatos
Соответственно по доброму этим функциям тоже надо дать средство как-нибудь ругаться наружу, вопрос как это реализовать?

Почитайте классическое определение функции
Функция - это ящик, который возвращает вам только заранее определенные значения
21 фев 13, 14:22    [13961119]     Ответить | Цитировать Сообщить модератору
 Re: Вывод дополнительных значений из User Defined Function  [new]
euthanatos
Member

Откуда:
Сообщений: 33
Гость333,

Я хотел бы избежать такого подхода по ряду причин:

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

во вторых, вынесение таких проверок в подпроцедуры, а так же тот факт, что часто узнать о том, что-то не в порядке можно только после выполнения большей части функции, в универсальном случае ведет к тому, что рациональней вообще отказаться от использования некоторых видов функций, заменив их полностью процедурами. А мне не хотелось бы пока отказываться от табличных функций. Конечно придется так поступить, если иного решения не будет найдено, но затем я и создал тему.
21 фев 13, 14:29    [13961184]     Ответить | Цитировать Сообщить модератору
 Re: Вывод дополнительных значений из User Defined Function  [new]
euthanatos
Member

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

И я ничего не имел против этого скажем в Дельфи, когда фунция вполне могла изменять данные вне себя, такие как глобальные переменные, скажем. Но функции T-SQL так ограниченны в возможностях, что мой опыт в других языках абсолютно бесполезен в этом.
21 фев 13, 14:33    [13961219]     Ответить | Цитировать Сообщить модератору
 Re: Вывод дополнительных значений из User Defined Function  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
http://msdn.microsoft.com/ru-ru/library/ms186755%28v=sql.105%29.aspx
В функциях допустимы следующие инструкции.

  • Инструкции присваивания.
  • Инструкции управления потоком, за исключением инструкций TRY...CATCH.
  • Инструкции DECLARE, объявляющие локальные переменные и локальные курсоры.
  • Инструкции SELECT, которые содержат списки выбора с выражениями, присваивающими значения локальным переменным.
  • Операции над локальными курсорами, которые объявляются, открываются, закрываются и освобождаются в теле функции. Допустимы только те инструкции FETCH, которые предложением INTO присваивают значения локальным переменным. Инструкции FETCH, возвращающие данные клиенту, недопустимы.
  • Инструкции INSERT, UPDATE и DELETE, которые изменяют локальные табличные переменные.
  • Инструкции EXECUTE, вызывающие расширенные хранимые процедуры.

  • Если вам понадобилось рейзить ошибку из функции -- значит, скорее всего, у вас проблемы с архитектурой БД или T-SQL кодом.
    Если же все-таки, не смотря ни на что, очень этого хочется и вопросы производительности для вас несущественны -- пишите CLR-функции.
    21 фев 13, 14:53    [13961344]     Ответить | Цитировать Сообщить модератору
     Re: Вывод дополнительных значений из User Defined Function  [new]
    Гость333
    Member

    Откуда:
    Сообщений: 3683
    euthanatos
    в универсальном случае ведет к тому, что рациональней вообще отказаться от использования некоторых видов функций, заменив их полностью процедурами

    Собственно, зачастую так и делают. Не только из-за ограниченных возможностей функций, а ещё потому, что они могут серьёзно просадить производительность запросов.
    Выдачу результата из хранимой процедуры можно сделать, например, посредством временной таблицы (чтобы потом не мучаться с вложенными INSERT EXEC).
    21 фев 13, 15:04    [13961433]     Ответить | Цитировать Сообщить модератору
     Re: Вывод дополнительных значений из User Defined Function  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47052
    Гость333
    они могут серьёзно просадить производительность запросов.
    Смотря какие, вообще-то
    21 фев 13, 15:12    [13961513]     Ответить | Цитировать Сообщить модератору
     Re: Вывод дополнительных значений из User Defined Function  [new]
    Гость333
    Member

    Откуда:
    Сообщений: 3683
    iap
    Гость333
    они могут серьёзно просадить производительность запросов.
    Смотря какие, вообще-то

    Ну так, между строк следует читать — могут и не просадить
    ТСу на данном этапе лучше обойтись без пользовательских функций, я считаю.
    21 фев 13, 15:43    [13961793]     Ответить | Цитировать Сообщить модератору
     Re: Вывод дополнительных значений из User Defined Function  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    euthanatos
    Но функции T-SQL так ограниченны в возможностях, что мой опыт в других языках абсолютно бесполезен в этом.

    Вообще опыт ЯП из других областей хорошо если просто бесполезен. Зачастую он бывает вреден.
    Например, вы наверное в Дельфи привыкли с данными работать по одной записи.
    А такой подход для SQL даст отвратительные результаты
    21 фев 13, 16:41    [13962254]     Ответить | Цитировать Сообщить модератору
     Re: Вывод дополнительных значений из User Defined Function  [new]
    tunknown
    Member

    Откуда:
    Сообщений: 768
    euthanatos
    Соответственно по доброму этим функциям тоже надо дать средство как-нибудь ругаться наружу, вопрос как это реализовать?

    Можно так:
    create function dbo.q() returns int as begin return 1/0 end
    

    Однако, это не соответствует текущему правильному подходу к работе с данными. Процедурный подход delphi не совсем применим к T-SQL. Лучше пересмотреть архитектуру.
    21 фев 13, 17:58    [13962762]     Ответить | Цитировать Сообщить модератору
     Re: Вывод дополнительных значений из User Defined Function  [new]
    euthanatos
    Member

    Откуда:
    Сообщений: 33
    В общем на функции надеятся не стоит, да?
    В любом случае, спасибо всем откликнувшимся за помощь!
    22 фев 13, 07:33    [13964587]     Ответить | Цитировать Сообщить модератору
     Re: Вывод дополнительных значений из User Defined Function  [new]
    Сон Веры Павловны
    Member

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

    Если что - хранимые процедуры тоже могут возвращать выборки. А вместе с этими выборками - out-параметры. Если нет необходимости далее джойнить результат этой функции с чем-то (а судя по желанию обработать доп. значение, это так и есть) - используйте ХП.
    22 фев 13, 08:19    [13964677]     Ответить | Цитировать Сообщить модератору
     Re: Вывод дополнительных значений из User Defined Function  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    euthanatos
    В общем на функции надеятся не стоит, да?

    Не стоит проецировать на функции TSQL свои представления/опыт из других ЯП
    22 фев 13, 10:18    [13965197]     Ответить | Цитировать Сообщить модератору
     Re: Вывод дополнительных значений из User Defined Function  [new]
    Mind
    Member

    Откуда: Лучший город на Земле
    Сообщений: 2322
    euthanatos
    И я ничего не имел против этого скажем в Дельфи, когда фунция вполне могла изменять данные вне себя, такие как глобальные переменные, скажем.
    И вы считаете это нормальной практикой? Я бы за такое расстреливал...
    23 фев 13, 01:48    [13969782]     Ответить | Цитировать Сообщить модератору
     Re: Вывод дополнительных значений из User Defined Function  [new]
    locky
    Member

    Откуда: Харьков, Украина
    Сообщений: 62034
    Mind
    euthanatos
    И я ничего не имел против этого скажем в Дельфи, когда фунция вполне могла изменять данные вне себя, такие как глобальные переменные, скажем.
    И вы считаете это нормальной практикой? Я бы за такое расстреливал...

    WinAPI, например, на 90% состоит из таких функций - и никого это не пугает.

    Да, безусловно, существуют сценарии, при которых возможны побочные эффекты
    с другой стороны - мы вроде как взрослые мальчики - дайте нам возможность выстрелить себе в ногу :)

    В скуле вообще не хватает довольно много фич, которые "неправильны с точки зрения теории" - но чертовски удобны с сугубо практической точки зрения.
    23 фев 13, 02:08    [13969796]     Ответить | Цитировать Сообщить модератору
     Re: Вывод дополнительных значений из User Defined Function  [new]
    aleks2
    Guest
    locky
    WinAPI, например, на 90% состоит из таких функций - и никого это не пугает.


    То, что некая шняга декларируется как "function ..." - чистая номиналистика.
    В T-SQL тоже есть такие "function", тока они называются "procedure".
    23 фев 13, 11:51    [13970115]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить