SQL Server中的游标和更新

时间:2011-11-16 08:14:45

标签: sql-server database-cursor

当我尝试在SQL Server 2005中执行此代码时收到错误消息:

  

Msg 156,Level 15,State 1,Line 20
  关键字'close'附近的语法不正确。
  Msg 102,Level 15,State 1,Line 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 个答案:

答案 0 :(得分:2)

TRY块后面必须紧跟CATCH块:

BEGIN TRY
    -- some statements here
END TRY
BEGIN CATCH
    -- other statements here
END CATCH

答案 1 :(得分:1)

请使用以下sql cursor脚本

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更改后,您将无法再次更改

答案 2 :(得分:0)

您有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

上的文档