Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
makar182 Member Откуда: Сообщений: 36 |
Добрый вечер! Прошу помочь. При попытке RETURN-а из процедуры не могу получить корректное значение переменной, которой я проставил оператор OUTPUT: EXECUTE @REST_VOLUME = MARK_UCHO_ACT_OVERFILL @INNER_RES_ID,@INNER_ART_ID,@ORDERS_RP_TYPE,@ORDERS_RP_CODE,@REST_VOLUME @REST_VOLUME и в вызываемой и в вызывающей процедурах имеет тип REAL. Так выглядит определение процедуры, из которой я через OUTPUT пытаюсь получить значение: ALTER PROCEDURE [dbo].[MARK_UCHO_ACT_OVERFILL] @INNER_RES_ID INT,@INNER_ART_ID INT,@ORDERS_RP_TYPE INT,@ORDERS_RP_CODE BIGINT,@REST_VOLUME REAL OUTPUT В этом месте я пытаюсь выйти из процедуры и вернуть текущее значение @REST_VOLUME из процедуры MARK_UCHO_ACT_OVERFILL: IF NOT EXISTS (SELECT * FROM #TEMP) RETURN; Но во всех случаях возвращаемое в @REST_VOLUME значение равно нулю? хотя прямо перед RETURN значение не равно нулю. Почему так происходит? P.S.:В другом месте процедуры я использовал такую же схему возврата значения переменной и там никаких проблем не было. |
31 окт 15, 20:06 [18353757] Ответить | Цитировать Сообщить модератору |
При попытке SATURN
Guest |
makar182, чтобы вернуть через
EXECUTE @REST_VOLUME =
нужно делать
RETURN @REST_VOLUME
чтобы вернуть через изменение out параметра в вызове он тоже должен быть помечен как out а не только в объявлении процедуры |
31 окт 15, 20:09 [18353767] Ответить | Цитировать Сообщить модератору |
makar182 Member Откуда: Сообщений: 36 |
Не надо помечать в вызове. https://technet.microsoft.com/ru-ru/library/ms187004(v=sql.105).aspx |
||
31 окт 15, 20:22 [18353802] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
смотрим в книгу, видим фигу? К сообщению приложен файл. Размер - 15Kb |
||
31 окт 15, 20:49 [18353890] Ответить | Цитировать Сообщить модератору |
makar182 Member Откуда: Сообщений: 36 |
Тогда каким образом у меня срабатывает точно такая же схема, только в другой части процедуры, где я не использую OUTPUT при вызове? Да и вызываю процедуру я иначе: EXECUTE @REST_VOLUME = MARK_UCHO_ACT_OVERFILL @INNER_RES_ID,@INNER_ART_ID,@ORDERS_RP_TYPE,@ORDERS_RP_CODE,@REST_VOLUME |
||||
31 окт 15, 21:15 [18353992] Ответить | Цитировать Сообщить модератору |
makar182 Member Откуда: Сообщений: 36 |
И еще вопрос - зачем в RETURN указывать переменную? В статье по ссылке не используется указание переменной в RETURN. |
||||
31 окт 15, 21:18 [18354007] Ответить | Цитировать Сообщить модератору |
saturn duality
Guest |
makar182, это вопрос к автору кода, который то ли через return, то ли через out параметр свой rest_volume получить хочет может не определился или хочет узнать, у какого из двух присвоений в одну переменную приоритет выше |
31 окт 15, 21:30 [18354071] Ответить | Цитировать Сообщить модератору |
makar182 Member Откуда: Сообщений: 36 |
Я и есть автор кода. Я не могу понять почему в примере ниже у меня все срабатывает: EXECUTE @REST_VOLUME = SPIKE.dbo.MARK_UCHO_INNER_CURSOR_RP_TYPE_2 @INNER_RES_ID, @INNER_ART_ID,@INNER_CNTR_ID,@INNER_RP_TYPE,@INNER_RP_CODE,@INNER_VOL_PCS,@INNER_LAST_DATE ,@INNER_PARSED,@INNER_STATUS_ID_SYNC,@INNER_ORDER_DT_SYNC,@INNER_INCOME_DT_SYNC,@INNER_COMMENT ,@INNER_IS_MY_ACT,@ORDERS_RP_TYPE, @ORDERS_RP_CODE, @ORDERS_VOL_PCS,@ORDERS_DATE,@FLAG_FOR_RP_TYPE_100,@REST_VOLUME ALTER PROCEDURE [dbo].[MARK_UCHO_INNER_CURSOR_RP_TYPE_2] @INNER_RES_ID INT, @INNER_ART_ID INT,@INNER_CNTR_ID INT,@INNER_RP_TYPE INT,@INNER_RP_CODE BIGINT ,@INNER_VOL_PCS REAL,@INNER_LAST_DATE DATETIME,@INNER_PARSED BIT,@INNER_STATUS_ID_SYNC INT ,@INNER_ORDER_DT_SYNC DATE,@INNER_INCOME_DT_SYNC DATE,@INNER_COMMENT NVARCHAR(255),@INNER_IS_MY_ACT BIT ,@ORDERS_RP_TYPE INT, @ORDERS_RP_CODE BIGINT, @ORDERS_VOL_PCS REAL,@ORDERS_DATE DATETIME,@FLAG_FOR_RP_TYPE_100 DATETIME,@REST_VOLUME REAL OUTPUT Я спокойно получаю в @REST_VOLUME необходимое значение, при этом я не указываю ничего в RETURN, т.к. я уже указал в OUTPUT - также как в статье по ссылке: --Пример RETURN-а IF ((SELECT IS_MY_ACT FROM SPIKE.dbo.MARK_ORDERS_LAST_DATE_CURSOR WHERE 1=1 AND RP_TYPE = @INNER_RP_TYPE AND RP_CODE = @INNER_RP_CODE ) IS NOT NULL) BEGIN RETURN END Почему в описанной в начале темы ситуации такая схема не срабатывает? Я не стал бы спорить, если бы у меня не было аналогичного, но рабочего, примера. |
||
31 окт 15, 21:46 [18354136] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37138 |
Какое еще "Я спокойно получаю в @REST_VOLUME необходимое значение", если оно не возвращается из процедуры в принципе? Автор, давайте вы предоставите полное репро вашей ситуации, начиная, скажем, с CREATE DATABASE. |
||
31 окт 15, 22:13 [18354238] Ответить | Цитировать Сообщить модератору |
makar182 Member Откуда: Сообщений: 36 |
Вы были правы. Но что самое интересное, что код был написан так, что оно работало и я думал что благодаря передачи переменной через OUTPUT, а оказалось, что там была страховка:) Но как тогда все же можно передать значение из процедуры в вызывающую процедуру? |
||||
31 окт 15, 22:44 [18354324] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31778 |
|
||||||
31 окт 15, 22:49 [18354336] Ответить | Цитировать Сообщить модератору |
makar182 Member Откуда: Сообщений: 36 |
alexeyvg, Все, разобрался! Спасибо всем большое:) Я до сих пор в шоке как это могло так долго работать:) Опыт использования T-SQL всего в несколько месяцев сказывается. |
31 окт 15, 22:52 [18354346] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |