Не удалось завершить операцию с курсором, поскольку установленные параметры изменились - PullRequest
0 голосов
/ 19 февраля 2019
DECLARE @dbname VARCHAR(100)
DECLARE db_cursor CURSOR READ_ONLY FOR
  SELECT name FROM master.dbo.sysdatabases WHERE version != 0

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname

WHILE @@FETCH_STATUS = 0
BEGIN

  --SELECT 'IF (@dbname = ''' + name + ''') USE ' + name FROM master.dbo.sysdatabases WHERE version != 0 AND name NOT IN ('msdb', 'master', 'tempdb', 'model')
  IF (@dbname = 'A') USE A
  IF (@dbname = 'B') USE B
  IF (@dbname = 'C') USE C
  IF (@dbname = 'D') USE D
  IF (@dbname = 'E') USE E
  IF (@dbname = 'F') USE F
  IF (@dbname = 'G') USE G
  IF (@dbname = 'H') USE H
  IF (@dbname = 'I') USE I

  FETCH NEXT FROM db_cursor INTO @dbname
END

CLOSE db_cursor
DEALLOCATE db_cursor

Я получил следующую ошибку

Не удалось завершить операцию курсора, так как изменились установленные параметры

В чем проблема?

1 Ответ

0 голосов
/ 19 февраля 2019

Я пытаюсь смоделировать вашу проблему.

Изменение базы данных может вызвать ошибку, но я попытался использовать exec и изменил A на master

, как это:

  GO
Create procedure proc_UseDatabase as 
begin
declare @DB as varchar(max)
DECLARE @dbname VARCHAR(100)
DECLARE db_cursor CURSOR FOR
  SELECT name FROM  master.[dbo].sysdatabases WHERE version != 0

OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @dbname

WHILE @@FETCH_STATUS = 0
BEGIN

  --SELECT 'IF (@dbname = ''' + name + ''') USE ' + name FROM master.dbo.sysdatabases WHERE version != 0 AND name NOT IN ('msdb', 'master', 'tempdb', 'model')
  IF (@dbname = 'master')
  set @DB = 'USE master'
  exec(@DB)

   IF (@dbname = 'B')
  set @DB = 'USE B'
  exec(@DB)
   IF (@dbname = 'C')
  set @DB = 'USE C'
  exec(@DB)
   IF (@dbname = 'D')
  set @DB = 'USE D'
  exec(@DB)
   IF (@dbname = 'E')
  set @DB = 'USE E'
  exec(@DB)
   IF (@dbname = 'F')
  set @DB = 'USE F'
  exec(@DB)
   IF (@dbname = 'G')
  set @DB = 'USE G'
  exec(@DB)
   IF (@dbname = 'H')
  set @DB = 'USE H'
  exec(@DB)
   IF (@dbname = 'I')
  set @DB = 'USE I'
  exec(@DB)

 set @DB = @DB
  FETCH NEXT FROM db_cursor INTO @dbname
END
select @DB  -- Just get the return value of 'exec' to view a result
CLOSE db_cursor
DEALLOCATE db_cursor
end
GO

Возврата ошибки нет:

Вы также можете смоделировать это.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...