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

Откуда:
Сообщений: 607
DECLARE DataBases_cursor CURSOR FOR 
select name, dbid
from sysdatabases
where name<>'tempdb'

OPEN DataBases_cursor
FETCH FROM DataBases_cursor
INTO @BaseName, @DB_id
IF NOT (@BaseName IN(@ExcludedNames))
BEGIN
print ''
FETCH NEXT FROM DataBases_cursor
SET @sql = 'USE ' + @BaseName+' '
set @sql = @sql + 'declare @dbsize dec(15,2) '
set @sql = @sql + 'declare @dsize dec(15,2) '
set @sql = @sql + 'declare @logsize dec(15,2) '
set @sql = @sql + 'declare @fnames varchar(1500) '
set @sql = @sql + 'declare @bytesperpage dec(15,2) '
set @sql = @sql + 'declare @pagesperMB dec(15,2) '
set @sql = @sql + 'select @dbsize = sum(convert(dec(15),size)) from dbo.sysfiles where (status & 64 = 0) '
set @sql = @sql + 'select @logsize = sum(convert(dec(15),size))from dbo.sysfiles where (status & 64 <> 0) '
set @sql = @sql + 'select @bytesperpage = low from master.dbo.spt_values where number = 1 and type = ''E'''
set @sql = @sql + 'select @pagesperMB = 1048576 / @bytesperpage '
set @sql = @sql + 'set @dsize = (@dbsize + @logsize) / @pagesperMB '
set @sql = @sql + 'select @fnames = filename from dbo.sysfiles where fileid=1 '
set @sql = @sql + 'insert into ##aaa ([Bases Name],[Bases Size (MB)],[File Name])values(db_Name(),@dsize,@fnames)'
print @sql
EXEC (@sql)
END
close DataBases_cursor
deallocate DataBases_cursor
Куроср не переходит, выполняется один раз и все. Подскажите что не так делаю? Заранее спасибо.
22 сен 09, 11:38    [7691246]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
Glory
Member

Откуда:
Сообщений: 104760
А цикл то где ?
22 сен 09, 11:43    [7691291]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
caper
Member

Откуда: Москва
Сообщений: 418
а где @@fetchstatus?
у вас не организован цикл пробега по записям курсора
22 сен 09, 11:43    [7691300]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
teCa
Member

Откуда:
Сообщений: 607
Можно по порядку.

Создём список элементов?

DECLARE DataBases_cursor CURSOR FOR 
select name, dbid
from sysdatabases

Здесь мы открываем курсор.
OPEN DataBases_cursor
FETCH FROM DataBases_cursor

тут собственно сам перебор элементов

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM DataBases_cursor
тело цикла
END

подчищаем все

close DataBases_cursor
deallocate DataBases_cursor

Правильно или что то забыл или напутал?
22 сен 09, 11:57    [7691446]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
Glory
Member

Откуда:
Сообщений: 104760
teCa


Правильно или что то забыл или напутал?

FETCH надо делать непосредственно перед проверкой @@FETCH_STATUS, а не за "сотню" команд до нее
22 сен 09, 12:01    [7691470]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
teCa
Member

Откуда:
Сообщений: 607
Glory
FETCH надо делать непосредственно перед проверкой @@FETCH_STATUS, а не за "сотню" команд до нее


Какой именно?

FETCH FROM или FETCH NEXT FROM

FETCH FROM у меня и так вроде непосредственно беред проверкой?
22 сен 09, 12:04    [7691486]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
Glory
Member

Откуда:
Сообщений: 104760
teCa
Glory
FETCH надо делать непосредственно перед проверкой @@FETCH_STATUS, а не за "сотню" команд до нее


Какой именно?

FETCH FROM или FETCH NEXT FROM

FETCH FROM у меня и так вроде непосредственно беред проверкой?

Любой FETCH нужно делать непосредственно перед проверкой
22 сен 09, 12:09    [7691537]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
teCa
Member

Откуда:
Сообщений: 607
DECLARE @BaseName varchar(20)
DECLARE @DB_id int
DECLARE DataBases_cursor CURSOR FOR 
select name, dbid
from sysdatabases
OPEN DataBases_cursor
FETCH FROM DataBases_cursor
INTO @BaseName, @DB_id
FETCH NEXT FROM DataBases_cursor
WHILE @@FETCH_STATUS = 0
BEGIN
print @@FETCH_STATUS
END
close DataBases_cursor
deallocate DataBases_cursor

Цикл получается замкнутый.
22 сен 09, 12:15    [7691602]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
FETCH FROM DataBases_cursor
INTO @BaseName, @DB_id
WHILE @@fetch_status =0 begin -- ето тоже надо
IF NOT (@BaseName IN(@ExcludedNames))
BEGIN
print ''
SET @sql = 'USE ' + @BaseName+' '
set @sql = @sql + 'declare @dbsize dec(15,2) '
set @sql = @sql + 'declare @dsize dec(15,2) '
set @sql = @sql + 'declare @logsize dec(15,2) '
set @sql = @sql + 'declare @fnames varchar(1500) '
set @sql = @sql + 'declare @bytesperpage dec(15,2) '
set @sql = @sql + 'declare @pagesperMB dec(15,2) '
set @sql = @sql + 'select @dbsize = sum(convert(dec(15),size)) from dbo.sysfiles where (status & 64 = 0) '
set @sql = @sql + 'select @logsize = sum(convert(dec(15),size))from dbo.sysfiles where (status & 64 <> 0) '
set @sql = @sql + 'select @bytesperpage = low from master.dbo.spt_values where number = 1 and type = ''E'''
set @sql = @sql + 'select @pagesperMB = 1048576 / @bytesperpage '
set @sql = @sql + 'set @dsize = (@dbsize + @logsize) / @pagesperMB '
set @sql = @sql + 'select @fnames = filename from dbo.sysfiles where fileid=1 '
set @sql = @sql + 'insert into ##aaa ([Bases Name],[Bases Size (MB)],[File Name])values(db_Name(),@dsize,@fnames)'

FETCH NEXT FROM DataBases_cursor 
INTO @BaseName, @DB_id ---  здеся должно быть

где то так
-------------------------------------
Jedem Das Seine
22 сен 09, 12:16    [7691606]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Мда

WHILE @@FETCH_STATUS = 0
BEGIN
тело цикла

/*а вот здесь последней командой идет FETCH*/
FETCH NEXT FROM DataBases_cursor
/*потому что следующей командой будет проверка @@FETCH_STATUS циклом*/
END
22 сен 09, 12:17    [7691620]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
teCa
Member

Откуда:
Сообщений: 607
DECLARE @BaseName varchar(20)
DECLARE @DB_id int
DECLARE DataBases_cursor CURSOR FOR 
select name, dbid
from sysdatabases
OPEN DataBases_cursor
FETCH FROM DataBases_cursor
INTO @BaseName, @DB_id
WHILE @@FETCH_STATUS = 0
BEGIN
print @BaseName
FETCH NEXT FROM DataBases_cursor
END
close DataBases_cursor
deallocate DataBases_cursor

Цикл срабатывает нужное колличество раз, но не переключается.
22 сен 09, 12:24    [7691673]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
teCa
Цикл срабатывает нужное колличество раз, но не переключается.
Чего, куда не переключается?
Вам уже несколько примеров привели.
22 сен 09, 12:28    [7691703]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
И почему вы фетчите в цикле в "воздух", а не в переменные?

Сообщение было отредактировано: 22 сен 09, 12:30
22 сен 09, 12:29    [7691716]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
Glory
Member

Откуда:
Сообщений: 104760
teCa


Цикл срабатывает нужное колличество раз, но не переключается.

USE mydb в динамическом запросе действует только в этом динамическом запросе. Это боян в бородой
22 сен 09, 12:30    [7691720]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
teCa
Member

Откуда:
Сообщений: 607
tpg
И почему вы фетчите в цикле в "воздух", а не в переменные?


так я и пытаюсь понять как правильно работать с курсором.
22 сен 09, 12:34    [7691758]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
teCa,
ну так посмотрите ВСЕ ответы
22 сен 09, 12:38    [7691787]     Ответить | Цитировать Сообщить модератору
 Re: Покажите ошибку в курсоре?  [new]
teCa
Member

Откуда:
Сообщений: 607
ага, уже разобрася, спасибо всем.
22 сен 09, 13:00    [7691971]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить