Impossible de créer un schéma à l'intérieur du bloc de début

Je suis complètement perplexe. J'ai le bloc suivant:

IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'Test') BEGIN CREATE SCHEMA Test; END; 

Si je lance ceci contre notre SQL Server 2008, j'obtiens "Msg 156, niveau 15, état 1, ligne 3: Syntaxe incorrecte près du mot-key" SCHEMA "" mais si je cours seulement la command CREATE SCHEMA , cela fonctionne.

Aussi, cela fonctionne:

 IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'Test') BEGIN PRINT 'CREATE GOES HERE'; END; 

Qu'est-ce que je fais mal?

Le message d'erreur est un peu d'un hareng rouge ici …. Exécutez ce qui suit pour voir ce que l'erreur "réelle" est:

 SELECT * FROM sys.schemas CREATE SCHEMA Test 

Msg 111, niveau 15, état 1, ligne 2

'CREATE SCHEMA' doit être la première instruction dans un lot de requête.

Pour contourner ce problème, vous pouvez utiliser la fonction EXEC :

 IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Test') BEGIN EXEC ('CREATE SCHEMA Test;'); END; 

Vous ne pouvez pas vérifier si les schémas existent de cette façon, vous devriez le faire de cette façon:

 IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'Test') BEGIN execute('CREATE SCHEMA Test'); END; 

La raison en est que le moteur DB comstack votre code avant de l'exécuter mais ne valide pas la logique de votre code. Au cours de la compilation du moteur voit que votre schéma existe déjà une augmentation d'une erreur. Ma solution fonctionne parce que DB ne comstack pas SQL dynamic donc il ne sait pas que vous essayez de créer un schéma existant.

Essaye celui-là –

 IF NOT EXISTS(SELECT 1 FROM sys.schemas WHERE name = 'Test') BEGIN EXEC sys.sp_executesql N'CREATE SCHEMA Test;' END 

Si vous devez créer un schéma dans une autre database plutôt que dans le context actuel, vous devez exécuter le script suivant.

 set @myScript = 'exec' + QUOTENAME (@DBName) + '.sp_executesql N''crée pas le schéma MySchema' ''
 exécuter (@myScript)