2011-11-16 36 views
1

我收到的时候我试图在SQL Server 2005中执行此代码的错误消息:光标和更新在SQL Server

消息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 
+2

我不使用'TRY'那么多的TSQL,但不应该有一个'CATCH'在那里,什么地方? –

+1

出于好奇,你打算如何阻止'while'? – CyberDude

+0

@Cyber​​Dude - 我认为他会取过去光标结束,并得到一个运行时错误。 –

回答

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

2

本文档的TRY块必须紧跟一个CATCH块:

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

恳求E使用下列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 

注意,集@stat声明语句被移动到光标 因为之后的第一个替换原来的@stat变化,你就无法再改变它