Pourquoi ne puis-je pas utiliser "create schema" dans un bloc begin / end dans SQL Management Studio?

J'ai généré un script qui crée tous les users et les schémas pour cette database et quand j'enveloppe les instructions CREATE avec une vérification IF EXISTS, je trouve qu'il n'autorise pas l'appel CREATE SCHEMA à s'exécuter dans le bloc BEGIN / END. Il se plaint que c'est une syntaxe invalide. Pourtant, je peux exécuter la command par elle-même. Un exemple du code est ci-dessous. J'utilise SQL Server 2008 et Management Studio R2. Pourquoi cette syntaxe est-elle invalide?

--DROP SCHEMA [acme] IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme')) BEGIN CREATE SCHEMA [acme] AUTHORIZATION [dbo] END 

Les créations de schéma doivent être la seule déclaration d'un lot. Une façon de contourner le problème est la suivante:

 IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme')) BEGIN EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]') END 

Voici une solution encore plus simple (vérification plus simple):

 IF (SCHEMA_ID('acme') IS NULL) BEGIN EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]') END 

Il doit être dans son propre lot. Vous pouvez l'envelopper dans EXEC('')

 EXEC('CREATE SCHEMA [acme] AUTHORIZATION [dbo]') 

Je crois que la raison de l'exigence est quelque chose à voir avec une ancienne version de la syntaxe CREATE SCHEMA introduite dans la version 6.5 ( du less, c'est ce qui est dit ici ).

CREATE SCHEMA doit être dans son propre lot, donc l'intégrer dans un EXEC et vous devriez être OK.

 IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme')) BEGIN EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]') END