Курсор не включает первый оператор выбора в результаты - PullRequest
0 голосов
/ 30 декабря 2018

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

declare @Charge dec(10,2)
DECLARE CRS CURSOR
FOR 

SELECT 0.01*v9.charge  AS firstTENDAYS
from v9
where datepart(day,v9.trans_time_date) between 0 and 10  and 
@Charge=v9.charge


SELECT 0.02*V9.charge  AS secondTENDAYS
 from v9
where datepart(day,v9.trans_time_date) between 11 and 20  and
@Charge=v9.Charge

SELECT 0.03*V9.charge  AS thirdTENDAYS
from v9
where datepart(day,v9.trans_time_date) between 21 and 31  and
@Charge=v9.Charge

open CRS
FETCH NEXT FROM CRS
INTO @Charge
print  

WHILE @@FETCH_STATUS=0
BEGIN
print @Charge 
FETCH NEXT FROM CRS
INTO @Charge

END
CLOSE CRS
DEALLOCATE CRS

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

это абсолютно не должно быть сделано с курсором, но с обычным выбором.однако, чтобы показать вам, как должен работать курсор, я поместил его здесь:

Declare @firstTENDAYS table (charge decimal)
Declare @secondTENDAYS table (charge decimal)
Declare @thirdTENDAYS table (charge decimal)

Declare @Charge dec(10,2) =10
Declare CRS CURSOR FOR Select v9.charge, v9.trans_time_date From v9
Declare @v9_Charge numeric
Declare @v9_InsertDate smalldatetime


Open CRS
FETCH NEXT FROM CRS INTO @v9_Charge, @v9_InsertDate 
WHILE @@FETCH_STATUS=0
BEGIN
 If @v9_Charge = @Charge
 Begin
        If @v9_InsertDate  between 0 and 10   
         Insert Into @firstTENDAYS SELECT 0.01*@v9_Charge  
        Else If  @v9_InsertDate  between 10 and 20   
         Insert Into @secondTENDAYS SELECT 0.02*@v9_Charge  
        Else If  @v9_InsertDate  between 21 and 31  
         Insert Into @thirdTENDAYS SELECT 0.03*@v9_Charge 
 End

FETCH NEXT FROM CRS INTO @v9_Charge, @v9_InsertDate 
END;
CLOSE CRS;
DEALLOCATE CRS;


select * from  @firstTENDAYS
select * from  @secondTENDAYS 
select * from  @thirdTENDAYS
0 голосов
/ 30 декабря 2018

Я сбит с толку вашим запросом.Во-первых, я не понимаю, почему вы хотите использовать курсор вместо select ввода значений.

Но ваши запросы не должны ничего возвращать.Обратите внимание: объявлено

select 0.01*v9.charge  AS firstTENDAYS
from v9
where datepart(day, 9.trans_time_date) between 0 and 10 and
       @Charge = v9.charge;

@Charge, но не задано значение, поэтому оно равно NULL.Это должно провалить любые сравнения.

Ваши три запроса не связаны между собой, поэтому курсор является только первым запросом.Это может быть связано с проблемой, которую вы видите.

Я подозреваю, что вам нужен более простой запрос, например:

select (case when day(v9.trans_time_date) <= 10 then 'firstTenDays'
             when day(v9.trans_time_date) <= 20 then 'secondTenDays'
             else 'thirdTenDays'
        end) as which,
       (case when day(v9.trans_time_date) <= 10 then 0.01 * v9.charge
             when day(v9.trans_time_date) <= 20 then 0.02 * v9.charge
             else 0.03 * v9.charge
        end) as chart
from v9;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...