курсоры и обновление в SQL Server - PullRequest
1 голос
/ 16 ноября 2011

При попытке выполнить этот код в SQL Server 2005 появляется сообщение об ошибке:

Сообщение 156, Уровень 15, Состояние 1, Строка 20
Неверный синтаксис рядом с ключевым словом 'close'.
Сообщение 102, Уровень 15, Состояние 1, Строка 21
Неверный синтаксис рядом с 'dbname'.

Что не так с моим кодом?

DECLARE @name nvarchar(max), @stat nvarchar(max)   

set @stat = N'update DBNAME.dbo.Ad 
set Label = ''Special Ad'' where Label =''AdXXXX'''

DECLARE dbname CURSOR FOR select name from sys.databases where name like '%config%'

open dbname   
begin try
    while 1=1 
    begin
      fetch next from dbname into @name
      set @stat=REPLACE(@stat,'DBNAME',@name)
      exec sp_executesql @stat
    end  
end try

close dbname   
deallocate dbname

Ответы [ 3 ]

2 голосов
/ 16 ноября 2011
За блоком

A TRY должен немедленно следовать блок CATCH:

BEGIN TRY
    -- some statements here
END TRY
BEGIN CATCH
    -- other statements here
END CATCH
1 голос
/ 16 ноября 2011

Пожалуйста, используйте следующий sql курсор скрипт

DECLARE @name nvarchar(max), @stat nvarchar(max)

DECLARE dbname CURSOR FOR select name from sys.databases --where name like '%config%'  
open dbname    

FETCH NEXT FROM dbname INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN

    set @stat = N'update DBNAME.dbo.Ad  set Label = ''Special Ad'' where Label =''AdXXXX'''  
    set @stat=REPLACE(@stat,'DBNAME',@name)       
    exec sp_executesql @stat     

    FETCH NEXT FROM dbname INTO @name   
END

close dbname    
deallocate dbname 

Обратите внимание, что оператор объявления set @stat перемещен в курсор Потому что после первой замены исходные изменения @stat вы не сможете изменить снова

0 голосов
/ 16 ноября 2011

у вас есть блок TRY без блока CATCH:

...
open dbname   
begin try
  while 1=1 begin
      fetch next from dbname into @name
      set @stat=REPLACE(@stat,'DBNAME',@name)
      exec sp_executesql @stat

  end  
end try
begin catch
    <..some error handling code>
end catch
...

См. Документацию по TRY...CATCH

...