Instruction SQL GOTO utilisant une label de variable

J'espérais pouvoir faire quelque chose comme ça:

declare @label varchar set @label = 'label_1' goto @label label_1: label_2: 

bien sûr, SQL Server me donne une erreur de syntaxe incorrecte … alors je me demandais si je peux encore le faire avec une syntaxe légèrement différente?

J'ai préparé un hack fonctionnel qui peut s'avérer utile pour les autres. Sur SQL Server 2008, vous ne pouvez pas générer le goto dynamicment, ni fournir l'label dans une variable. Le hack old school consiste à charger la variable, à sauter à un point unique qui utilise ensuite les instructions if pour déterminer la destination réelle.

Les GOTO sont bien sûr considérés comme nuisibles et sont généralement une mauvaise idée.

 l1: print '1' l2: print '2' goto l4 l3: print '3' -- should not print l4: print '4' declare @lbl nvarchar(5) set @lbl = N'l6' goto vjump -- goto @lbl -- doesn't work -- exec('goto ' + @lbl) -- doesn't work l5: print '5' l6: print '6' l7: print '7' return vjump: if @lbl = 'l1' goto l1 if @lbl = 'l2' goto l2 if @lbl = 'l3' goto l3 if @lbl = 'l6' goto l6 

Cela produit

 1 2 4 6 7 

Vous ne pouvez le faire que si vous générez dynamicment l'instruction SQL.

Il vaut mieux éviter les GOTO, surtout pour la lisibilité du code.

Pourquoi ne pas simplement utiliser un if / else?

Pour autant que je sache, vous ne pouvez pas paramétrer GOTO. Vous pouvez le faire si vous utilisez Dynamic SQL.

Pas une réponse opportune évidemment, mais quand je me suis récemment trouvé vouloir faire ceci, la raison était parce que je voulais exécuter le même morceau de code plusieurs fois et ensuite returnner au stream normal, fondamentalement "gosub" et pas "goto". …

Et que tu peux faire. Pas avec un gosub, mais avec une procédure stockée temporaire – créer une procédure stockée temp create procedure #DRY , puis l'appeler. Vous pouvez le laisser tomber quand vous avez fini.

essaye ça:

 exec("goto "+@label)