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

Откуда:
Сообщений: 154
Пытаюсь разобраться с курсором, есть вот такой запрос:
set nocount on
declare @invoice char(10)

declare inv_number cursor
for select distinct EIVNO from RU1_RDI_INVOICE2 order by EIVNO
open inv_number
fetch next from inv_number into @invoice
print  @invoice

while @@fetch_status = 0
begin
fetch next from inv_number into @invoice
print @invoice
end


close inv_number
deallocate inv_number

В результате выдает:
3059790805
3059790806
3059790807
3059790808
3059790809
3059790810
3059790811
3059790812
3059790813
3059790814
3059790815
3059790815

Откуда получаются последние две одинаковые строки? Как сделать, чтобы не было одинаковых строк?
16 дек 04, 10:05    [1184545]     Ответить | Цитировать Сообщить модератору
 Re: Плиз, скажите в чем может быть ошибка.....  [new]
Glory
Member

Откуда:
Сообщений: 104760
А что выдает запрос
select distinct EIVNO from RU1_RDI_INVOICE2 order by EIVNO
16 дек 04, 10:14    [1184597]     Ответить | Цитировать Сообщить модератору
 Re: Плиз, скажите в чем может быть ошибка.....  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
имхо, @@fetch_status стал равен -1 после строки
fetch next from inv_number into @invoice, те набор уже кончился, попробуйте так и увидите
set nocount on
declare @invoice char(10)
declare inv_number cursor
for select distinct EIVNO from RU1_RDI_INVOICE2 order by EIVNO
open inv_number
fetch next from inv_number into @invoice
print  @invoice
while @@fetch_status = 0
begin
fetch next from inv_number into @invoice
print @invoice
print  @@fetch_status 
end
close inv_number
deallocate inv_number
имхо, @@fetch_status надо проверять после fetch
16 дек 04, 10:15    [1184602]     Ответить | Цитировать Сообщить модератору
 Re: Плиз, скажите в чем может быть ошибка.....  [new]
Джульетта
Member

Откуда:
Сообщений: 154
Glory
А что выдает запрос
select distinct EIVNO from RU1_RDI_INVOICE2 order by EIVNO


3059790805
3059790806
3059790807
3059790808
3059790809
3059790810
3059790811
3059790812
3059790813
3059790814
3059790815
16 дек 04, 10:17    [1184613]     Ответить | Цитировать Сообщить модератору
 Re: Плиз, скажите в чем может быть ошибка.....  [new]
Denbear
Member

Откуда: Екатеринбург
Сообщений: 26
Здесь ситуация следующая
Переменная @invoice выводится после перехода по строке, и соответственно там уже есть результат с предыдущего чтения.
Попробуйте сделать так:

while @@fetch_status = 0
begin
set @invoice = null
fetch next from inv_number into @invoice
print @invoice
end

по крайней мере у меня получилось :)
16 дек 04, 10:17    [1184617]     Ответить | Цитировать Сообщить модератору
 Re: Плиз, скажите в чем может быть ошибка.....  [new]
Джульетта
Member

Откуда:
Сообщений: 154
Smirnov Anton
имхо, @@fetch_status стал равен -1 после строки
fetch next from inv_number into @invoice, те набор уже кончился, попробуйте так и увидите
set nocount on
declare @invoice char(10)
declare inv_number cursor
for select distinct EIVNO from RU1_RDI_INVOICE2 order by EIVNO
open inv_number
fetch next from inv_number into @invoice
print  @invoice
while @@fetch_status = 0
begin
fetch next from inv_number into @invoice
print @invoice
print  @@fetch_status 
end
close inv_number
deallocate inv_number
имхо, @@fetch_status надо проверять после fetch


Да, на самом деле, в последней строке выдает -1. Как сделать, чтобы этого не было?
16 дек 04, 10:20    [1184628]     Ответить | Цитировать Сообщить модератору
 Re: Плиз, скажите в чем может быть ошибка.....  [new]
Джульетта
Member

Откуда:
Сообщений: 154
Denbear
Здесь ситуация следующая
Переменная @invoice выводится после перехода по строке, и соответственно там уже есть результат с предыдущего чтения.
Попробуйте сделать так:

while @@fetch_status = 0
begin
set @invoice = null
fetch next from inv_number into @invoice
print @invoice
end

по крайней мере у меня получилось :)


Спасибо, у меня тоже получилось. ;-)
16 дек 04, 10:22    [1184633]     Ответить | Цитировать Сообщить модератору
 Re: Плиз, скажите в чем может быть ошибка.....  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
необходимо проверять @@fetch_status после fetch, например так
while 1=1
begin
fetch next from inv_number into @invoice
if @@fetch_status = -1 break
if @@fetch_status = -2 continue
/*
какие то действия
print @invoice
*/
end
делал так всегда - проблем не было никогда
16 дек 04, 10:23    [1184639]     Ответить | Цитировать Сообщить модератору
 Re: Плиз, скажите в чем может быть ошибка.....  [new]
Denbear
Member

Откуда: Екатеринбург
Сообщений: 26
Вполне логично в таком случае можно сделать и так, тогда действительно не нужно делать присвоения null

while @@fetch_status = 0
begin
fetch next from inv_number into @invoice
if @@fetch_status = -1 break
print @invoice
end

и наверное это более правильный вариант :)
16 дек 04, 10:27    [1184660]     Ответить | Цитировать Сообщить модератору
 Re: Плиз, скажите в чем может быть ошибка.....  [new]
Джульетта
Member

Откуда:
Сообщений: 154
Smirnov Anton
необходимо проверять @@fetch_status после fetch, например так
while 1=1
begin
fetch next from inv_number into @invoice
if @@fetch_status = -1 break
if @@fetch_status = -2 continue
/*
какие то действия
print @invoice
*/
end
делал так всегда - проблем не было никогда


Получилось. Спасибо большое. ;-)))
16 дек 04, 10:28    [1184662]     Ответить | Цитировать Сообщить модератору
 Re: Плиз, скажите в чем может быть ошибка.....  [new]
Glory
Member

Откуда:
Сообщений: 104760
set nocount on
declare @invoice char(10)

declare inv_number cursor
for select distinct EIVNO from RU1_RDI_INVOICE2 order by EIVNO
open inv_number
fetch next from inv_number into @invoice

while @@fetch_status = 0
begin
    print  @invoice
    /*и другие нужные действия с _текущей_ позицией курсора */
    fetch next from inv_number into @invoice
end

close inv_number
deallocate inv_number
16 дек 04, 10:29    [1184669]     Ответить | Цитировать Сообщить модератору
 Re: Плиз, скажите в чем может быть ошибка.....  [new]
Джульетта
Member

Откуда:
Сообщений: 154
Glory
set nocount on
declare @invoice char(10)

declare inv_number cursor
for select distinct EIVNO from RU1_RDI_INVOICE2 order by EIVNO
open inv_number
fetch next from inv_number into @invoice

while @@fetch_status = 0
begin
    print  @invoice
    /*и другие нужные действия с _текущей_ позицией курсора */
    fetch next from inv_number into @invoice
end

close inv_number
deallocate inv_number


Спасибо. Так тоже получилось. Это даже лучше. :-)
16 дек 04, 10:47    [1184740]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить