web-dev-qa-db-fra.com

Syntaxe incorrecte près de 'GO'

Comment puis-je exécuter le code SQL suivant dans une seule commande (exécution unique) via ADO.NET?

ALTER TABLE [MyTable]
    ADD NewCol INT

GO

UPDATE [MyTable] 
    SET [NewCol] = 1

Le séparateur de lots GO n'est pas pris en charge et sans elle, la deuxième instruction échoue.

Existe-t-il des solutions à cela autres que l’utilisation de plusieurs exécutions command?

31
Andrew Bullock

Le mot clé GO n'est pas T-SQL, mais un artefact SQL Server Management Studio qui vous permet de séparer l'exécution d'un fichier de script en plusieurs lots.I.e. Lorsque vous exécutez un fichier de script T-SQL dans SSMS, les instructions sont exécutées par lots, séparés par le mot clé GO. Plus de détails peuvent être trouvés ici: https://msdn.Microsoft.com/en-us/library/ms188037.aspx

Si vous lisez cela, vous verrez que sqlcmd et osql supportent également GO.

SQL Server ne comprend pas le mot clé GO. Donc, si vous avez besoin d'un équivalent, vous devez séparer et exécuter les lots individuellement.

55
JotaBe

Supprimez la GO:

String sql = "ALTER TABLE  [MyTable] ADD NewCol INT;";
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();
sql = "UPDATE [MyTable] SET [NewCol] = 1";
cmd = new SqlCommand(sql, conn);
cmd.ExecuteNonQuery();

Il semble que vous puissiez utiliser la classe Server pour cela. Voici un article:

C #: exécution de scripts T-SQL par lots contenant des instructions GO

16
Rango

Cela peut également se produire lorsque votre séparateur de lot a été modifié dans vos paramètres. Dans SSMS, cliquez sur Outils -> Options et accédez à Exécution de la requête/SQL Server/Général pour vérifier ce séparateur de lot. 

Je viens d'avoir cet échec avec un script qui n'avait pas de fins de ligne CR LF. La fermeture et la réouverture du script semblent suggérer une solution. Juste une autre chose à vérifier! 

2
Gamic

Vous obtiendrez également cette erreur si vous avez utilisé des instructions IF et si vous les avez mal fermées.

N'oubliez pas que vous devez utiliser BEGIN/END si votre instruction IF est supérieure à une ligne.

Cela marche:

IF @@ROWCOUNT = 0
PRINT 'Row count is zero.'

Mais si vous avez deux lignes, cela devrait ressembler à ceci:

IF @@ROWCOUNT = 0
BEGIN
PRINT 'Row count is zero.'
PRINT 'You should probably do something about that.'
END
2
David Wilson

Nous avons rencontré cela en essayant de déterminer pourquoi ma requête ne fonctionnait pas dans SSRS. Vous n'utilisez pas GO dans SSRS, utilisez plutôt des points-virgules entre vos différentes instructions.

1
Vistance