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