Zoals vermeld in de opmerkingen, kun je GO
. niet plaatsen in het midden van een groep SQL-instructies die van elkaar afhankelijk zijn omdat:
-
GO
geeft het einde van een samengestelde batch en het begin van de volgende aan. De meeste instructiecontexten (zoals eenIF..ELSE
) kan niet eenGO
omvatten . En, -
GO
is niet eens een SQL-statement, het is een Management Studio/SQLCMD-opdracht, dus het wordt nergens anders herkend.
Uw situatie is een veelvoorkomende behoefte, maar er is niet één oplossing. Voor het specifieke geval dat u opsomt, is het gebruik van dynamische SQL waarschijnlijk de beste aanpak:
IF EXISTS(select * from sys.databases where name='MyDB')
BEGIN
EXEC('
USE MyDB
EXEC(''
DROP USER [tester]
.
.
.
'')
')
END
ELSE
PRINT 'MyDB database is not available'
Dit maakt gebruik van het feit dat Dynamic SQL-exections elk hun eigen batch vormen ter vervanging van GO
s effect (een nieuwe batch starten) en om de eigenaardige interacties van USE
te isoleren met de compiler. Het is natuurlijk erg kludgy vanwege de noodzaak om dingen "dubbel in te pakken" na de USE..GO
commando's.
Houd er ook rekening mee dat vanwege deze dubbele wikkeling alle tekenreeksen erin moeten worden viervoudig aangehaald.