2011-11-16 3 views
1

Je reçois un message d'erreur lorsque je suis en train d'exécuter ce code dans SQL Server 2005:curseurs et mise à jour dans SQL Server

Msg 156, niveau 15, état 1, ligne 20
incorrect syntaxe proche du mot clé 'close'.
Msg 102, niveau 15, état 1, ligne 21
Syntaxe incorrecte près de 'nom_base'.

Quel est le problème avec mon code?

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

Je n'utilise pas TRY tant dans TSQL, mais ne devrait-il pas y avoir un CATCH quelque part? –

+1

juste par curiosité, comment avez-vous l'intention d'arrêter ce 'while'? – CyberDude

+0

@CyberDude - Je suppose qu'il ira au-delà de la fin du curseur et obtiendra une erreur d'exécution. –

Répondre

0

vous avez un bloc TRY sans bloc 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 
... 

Voir la documentation sur TRY...CATCH

2

Un bloc TRY doit être immédiatement suivi d'un bloc CATCH:

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

Moyens e utiliser les éléments suivants sql cursor scénario

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 

Notez que l'ensemble @stat déclaration de déclaration est déplacé dans le curseur Car après la première remplacer les changements de @stat originaux et vous ne serez pas en mesure de le modifier à nouveau

Questions connexes