[Transact-SQL] instruction Go dans une condition If

instruction Go dans une condition If [Transact-SQL] - SQL/NoSQL - Programmation

Marsh Posté le 14-01-2007 à 16:32:36    

Salut,
 
j'ai un petit soucis de syntaxe pour un script transact SQL :
 
je dois mettre à jour en profondeur la structure d'une table AAAA ayant déjà des lignes
algo :
- créer une table AAAA_sv ayant la structure originelle de la table AAAA, et sauvegarder les données de AAAA dedans
- droper AAAA
- créer AAAA sous sa nouvelle structure (dont ajout de colonnes, je dis ça pour plus bas)
- copier AAAA_sv dans la nouvelle table AAAA, en initialisant les nouveaux champs
 
rien de bien compliqué quoi
 
ça doit etre fait dans un seul (important) fichier .sql (à executer sous sybase)
 
le probleme : je dois proteger le script pour une double execution.
 
j'ai donc essayé d'encapsuler mon code entre un  
 
if not exists (dbo.AAAA.un_nouveau_champ)
begin
 
SCRIPT
 
end
 
mon probleme :
dans mon script, il y a des GO (equivalent du ";" dans d'autres transact-SQL), et j'ai une erreur de syntaxe car ces GO marquent une fin de script (le compilo cherche le end associé au Go
 
j'ai essayé de virer les GO, mais j'ai une erreur entre par exemple le drop AAAA et le create AAAA(...) ("un objet AAAA existe déjà dans la base blablabla" )
 
j'aimerais garder mon script (qui marche bien), vous voyez une methode pour proteger mon script multi-ligne ?
 
- une façon de parentheser pour que le compilo comprenne où trouver le end final ?
- une instruction transact-SQL pour remplacer les Go et demander à commit certaines actions ?
 
sinon j'ai des solutions, mais pas en gardant mon "if not (nouveau champ existe) alors begin 'on passe le script de modif de la table' end", mais j'aimerais le garder si pissible
 
++
ben


---------------
Reckless inferior depraved repentant ruinous foul-mouthed revered master Rotoutou the great.
Reply

Marsh Posté le 14-01-2007 à 16:32:36   

Reply

Marsh Posté le 15-01-2007 à 23:52:01    

bon alors je poste quand même quelques réponses
 
- on ne peux pas droper/recréer une table dans un seul script (il faut un "go" entre les 2 instructions)
 
- impossible de parentheser : un batch .sql contenant plusieurs scripts (séparés par des "Go" ) ne peut pas etre encadré par un if (...) begin ...end
 
if test
 begin
  script1
  go
  script2
 end
go
 
syntaxe impossible (syntax error, genre "mot clé 'end' manquant pres de script1" )
 
- pas de jump non plus
 
if test
 begin
  goto :fin
 end
else
 begin
  script1
  go
  script 2
 end
go
:fin
 
syntaxe interdite (suntax error, genre "balise ':fin' non trouvée" )
 
- return n'aide pas
 
if test
 return
script1
go
script 2
go
 
dans ce cas, return ne fait pas sortir du batch, l'execution est transmise au script suivant le script qu'on quitte, celui qui suit le return et qui finit par Go, donc on execute script 2
 
- entre chaque script, on perd les variables qu'on a declarées
 
 
--> soluce 1 : il faut créer un flag - variable globale qui n'est pas détruite entre les scripts - à passer entre les differents scripts du batch, pour se rappeller l'etat intial
 
2 methodes :
- créer une table+champ et mettre le flag dedans, et droper la table à la fin du batch
- pour SQL server y a une variable appellé transact_info, qui peut etre utilisée pour stocker un flag inter-cript (non dispo sous sybase)
un truc du genre :
DECLARE @binSession varbinary(128)
SET @binSession = CONVERT(varbinary(128), 'Failure')
SET CONTEXT_INFO @binSession
GO
 
--> soluce 2 :
faire un raiserror avec un errolevel > 20, boum la connection et on sort direct (ça ecrit un log donc pas terrible, mais y a apparemment possibilité de ne pas ecrire dans le log, regardez la doc de votre sgbd)  
un truc du genre :
if test
 raiserror ('bye bye baby',20,1) WITH LOG,NOWAIT  
script1
go
script 2
go
 
++
ben


---------------
Reckless inferior depraved repentant ruinous foul-mouthed revered master Rotoutou the great.
Reply

Marsh Posté le 22-01-2007 à 15:22:21    

pkoi ne pas simplement faire une série de ALTER ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed