2011-11-16 73 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變化,你就無法再改變它