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

Откуда: Пермь
Сообщений: 22
Добрый день. Ситуация в следующем. Вызываю хранимую процедуру для сохранения данных.

declare
	@Res bigint,
	@ErrCode int,
	@ErrMessage varchar(4000),
	@CmpCallCard_Numv bigint,
	@CmpCallCard_Ngod bigint;

SET @Res = :CmpCallCard_id;
			
SET @CmpCallCard_Numv = (select ...);
SET @CmpCallCard_Ngod = (select ...);

exec proc_test @CmpCallCard_id = @Res output, @CmpCallCard_Numv = @CmpCallCard_Numv, @CmpCallCard_Ngod = @CmpCallCard_Ngod, @Error_Code = @ErrCode output, @Error_Message = @ErrMessage output;

select @Res as CmpCallCard_id, @ErrCode as Error_Code, @ErrMessage as Error_Msg;


так вот если переменным присвоить значение через SELECT

SET @CmpCallCard_Numv = (select ...);
SET @CmpCallCard_Ngod = (select ...);

то в результате запрос никаких данных из последнего запроса не вернет, но если допустим присвоить руками 123, то вернет CmpCallCard_id, Error_Code и Error_Msg;

Почему так может быть?
2 авг 12, 09:25    [12950201]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
SiZE,
SiZE
то в результате запрос никаких данных из последнего запроса не вернет,

Т.е вернет Null'ы?
2 авг 12, 09:30    [12950232]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
SiZE
Member

Откуда: Пермь
Сообщений: 22
denis2710,

Если так

SET @CmpCallCard_Numv = 1;
SET @CmpCallCard_Ngod = 2;


то вернет

CmpCallCard_id = 12394, Error_Code = NULL, Error_Msg = NULL

, а если так

SET @CmpCallCard_Numv = (select ...);
SET @CmpCallCard_Ngod = (select ...);


то пусто
2 авг 12, 09:35    [12950255]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
SiZE
Member

Откуда: Пермь
Сообщений: 22
В обоих случаях данные исправно вносятся в таблицу.
2 авг 12, 09:36    [12950258]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
Читатель неместный
Guest
попробуйте так
.....
SET @CmpCallCard_Numv = (select ...);
SET @CmpCallCard_Ngod = (select ...);
print @CmpCallCard_Numv
print @CmpCallCard_Ngod
......
2 авг 12, 09:40    [12950271]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
SiZE,
т.е получается,что этот select
select @Res as CmpCallCard_id, @ErrCode as Error_Code, @ErrMessage as Error_Msg;

вообще не отрабатывает?
2 авг 12, 09:42    [12950273]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
SiZE
, а если так
SET @CmpCallCard_Numv = (select ...);
SET @CmpCallCard_Ngod = (select ...);

то пусто

После того, как вы присвоили значения переменным. Проверьте, действительно ли вы их присвоили?
Сделайте после set ... - select @CmpCallCard_Numv, @CmpCallCard_Ngod, посмотрите, что записалось в переменные.
2 авг 12, 09:43    [12950282]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
SiZE
Member

Откуда: Пермь
Сообщений: 22
выполнил
declare
    @Res bigint,
    @ErrCode int,
    @ErrMessage varchar(4000),
    @CmpCallCard_Numv bigint,
    @CmpCallCard_Ngod bigint;
				
SET @CmpCallCard_Numv = (select ISNULL(max(case when cast(CCC.CmpCallCard_prmDT as date) = '2012-08-02' then CmpCallCard_Numv else null end), 0) + 1 from v_CmpCallCard CCC with (nolock))
SET @CmpCallCard_Ngod = (select ISNULL(max(case when YEAR(CCC.CmpCallCard_prmDT) = 2012 then CmpCallCard_Ngod else null end), 0) + 1 from v_CmpCallCard CCC with (nolock))
print @CmpCallCard_Numv;
print @CmpCallCard_Ngod;


вернулось

Warning: Null value is eliminated by an aggregate or other SET operation.
Warning: Null value is eliminated by an aggregate or other SET operation.
11113
22224
(266 ms)
2 авг 12, 09:51    [12950311]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
SiZE
Member

Откуда: Пермь
Сообщений: 22
denis2710, видимо да
2 авг 12, 09:53    [12950320]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
SiZE
Member

Откуда: Пермь
Сообщений: 22
SomewhereSomehow, вместо print сделал select результат один, ну собственно на всякий случай. Цифры в базу сохраняются нужные.
2 авг 12, 09:55    [12950328]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
SiZE,

Ну, у вас получается что если явно - вы присваиваете:
SET @CmpCallCard_Numv = 1;
SET @CmpCallCard_Ngod = 2;

Если нет, то
11113
22224

В зависимости от входных параметров, процедура, видимо, возвращает разные результаты.
2 авг 12, 09:59    [12950343]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
мимо
Guest
SiZE,
т.е. если так
SET @CmpCallCard_Numv = 1;
SET @CmpCallCard_Ngod = 2;

, то возвращает.

а если так
SET @CmpCallCard_Numv = (select 1);
SET @CmpCallCard_Ngod = (select 2);

,то нет?

Быть такого не могёт.
2 авг 12, 10:00    [12950351]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
SiZE,Это что-то из разряда фантастики.
Могу посоветовать, посмотреть профайлером,что же у вас там происходит.
2 авг 12, 10:34    [12950547]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
SiZE
Member

Откуда: Пермь
Сообщений: 22
Господа, я хочу узнать почему последний селект, который идет непосредственно сразу после сохранения данных процедурой, который должен возвращать идентификатор (@CmpCallCard_id), возвращает его только если я присвою переменным только какие-то явные значения? (напоминаю что при этом в таблицу процедура сохраняет, как явно заданные параметры (типа bigint), так и вычисленные в результате селектов).

Возможно ли что берется значение первого селекта? Который присваивает переменной значение.
2 авг 12, 11:29    [12950948]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
Glory
Member

Откуда:
Сообщений: 104760
SiZE
Возможно ли что берется значение первого селекта? Который присваивает переменной значение.

возьмите дебаггер и все узнаете из первых рук
2 авг 12, 11:32    [12950983]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
SiZE
Member

Откуда: Пермь
Сообщений: 22
мимо,

Попробовал сейчас так, все прокатило
SET @CmpCallCard_Numv = (select 25);
SET @CmpCallCard_Ngod = (select 25);


попробовал так, вернуло пустоту
SET @CmpCallCard_Numv = (select ISNULL(max(case when cast(CCC.CmpCallCard_prmDT as date) = '2012-08-02' then CmpCallCard_Numv else null end), 0) + 1 from v_CmpCallCard CCC with (nolock));
SET @CmpCallCard_Ngod = (select ISNULL(max(case when YEAR(CCC.CmpCallCard_prmDT) = 2012 then CmpCallCard_Ngod else null end), 0) + 1 from v_CmpCallCard CCC with (nolock));
2 авг 12, 11:32    [12950984]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
АМС
Member

Откуда: Столица нашей Родины
Сообщений: 192
SiZE,

А что у Вас за странный синтаксис такой.
Обычно вместо
SET @CmpCallCard_Numv = (select ...);
пишут
SELECT @CmpCallCard=что-то from из_чего-то
И все работает.
2 авг 12, 11:34    [12951009]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
SiZE,

Возможно то, что у вас написано в коде. От себя сервер ничего не придумывает.
Еще раз. Вы когда тестируете, прописывая значения явно - то это значения 1 и 2, а когда значения для переменных вычисляются подзапросом, то в переменных оказываются значения 11113 и 22224. После этого, вы вызываете процедуру с разными параметрами и удивляетесь разным результатам. По-крайней мере это следует из того что вы рассказываете.
Возможно причина и не в этом, а в том что вы где-то запутались в своих тестах. Что например это такое SET @Res = :CmpCallCard_id; ? Что присваивается этой переменной? Что происходит с переменными в процедуре?
2 авг 12, 11:37    [12951040]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> А что у Вас за странный синтаксис такой.
> Обычно вместо
> SET @CmpCallCard_Numv = (select ...);
> пишут
> SELECT @CmpCallCard=что-то from из_чего-то
> И все работает.

особенно классно работает, если запрос, не дай бог, несколько значений выдаст.
в первом-то случае ошибка будет, а вот второй - гораааздо занимательней.

Posted via ActualForum NNTP Server 1.5

2 авг 12, 11:39    [12951060]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
АМС
Member

Откуда: Столица нашей Родины
Сообщений: 192
daw,

Согласен. Есть такая проблема. Но отладку ещё никто не отменял!
2 авг 12, 11:46    [12951127]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
SiZE
Member

Откуда: Пермь
Сообщений: 22
Проблема видимо была из-за "Warning: Null value is eliminated by an aggregate or other SET operation.". Переписал запрос, варнинг исчез, все вернулось. Не знал.
2 авг 12, 11:48    [12951141]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
мимо
Guest
SiZE
мимо,

Попробовал сейчас так, все прокатило
SET @CmpCallCard_Numv = (select 25);
SET @CmpCallCard_Ngod = (select 25);


попробовал так, вернуло пустоту
SET @CmpCallCard_Numv = (select ISNULL(max(case when cast(CCC.CmpCallCard_prmDT as date) = '2012-08-02' then CmpCallCard_Numv else null end), 0) + 1 from v_CmpCallCard CCC with (nolock));
SET @CmpCallCard_Ngod = (select ISNULL(max(case when YEAR(CCC.CmpCallCard_prmDT) = 2012 then CmpCallCard_Ngod else null end), 0) + 1 from v_CmpCallCard CCC with (nolock));

Понятно, запросы кривые. Вот это
case when cast(CCC.CmpCallCard_prmDT as date) = '2012-08-02'
не гуд, по определению.

А насчет предыдущих значений, надо различать:
declare @t as varchar(250) = 25
select @t
select @t = Y.x from (select 1) y(x) where 1=0
select @t
set @t = (select  Y.x from (select 1) y(x) where 1=0)
select @t
2 авг 12, 11:49    [12951159]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
Glory
Member

Откуда:
Сообщений: 104760
SiZE
Переписал запрос, варнинг исчез, все вернулось.

Вернулось в ваше приложение ?

SiZE
Не знал.

Что приложение может реагировать на _все_, что возвращает сервер ?
2 авг 12, 11:50    [12951160]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
SiZE
Member

Откуда: Пермь
Сообщений: 22
мимо
Понятно, запросы кривые. Вот это
case when cast(CCC.CmpCallCard_prmDT as date) = '2012-08-02'
не гуд, по определению.

Изначально запрос таким достался, надо было решить срочно проблему с выдачей данных. Поэтому с этим не разбирался.
2 авг 12, 11:52    [12951186]     Ответить | Цитировать Сообщить модератору
 Re: Запрос не возвращает значение  [new]
SiZE
Member

Откуда: Пермь
Сообщений: 22
Glory, на выходе приложение ожидало увидеть CmpCallCard_id, а возвращался void. :)
2 авг 12, 11:56    [12951223]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить