80 votes

Pourquoi ne puis-je pas utiliser "créer un schéma" dans un bloc de début / fin dans SQL Management Studio?

J'ai généré un script qui crée tous les utilisateurs et schémas pour cette base de données et lorsque j'encapsule les instructions CREATE avec une vérification IF EXISTS, je trouve qu'il ne permet pas à l'appel CREATE SCHEMA de s'exécuter dans le bloc BEGIN / END. Il se plaint que sa syntaxe n'est pas valide. Pourtant, je peux exécuter la commande seule. Un exemple du code est ci-dessous. J'utilise SQL Server 2008 et Management Studio R2. Pourquoi cette syntaxe n'est-elle pas valide?

 --DROP SCHEMA [acme]

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

126voto

Tom H. Points 23783

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

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

44voto

Mark Whitfeld Points 623

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

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

11voto

Martin Smith Points 174101

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

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

Je crois que la raison de cette exigence est liée à une ancienne version de la syntaxe CREATE SCHEMA introduite dans la version 6.5 ( du moins c'est ce qu'elle dit ici ).

5voto

Joe Stefanelli Points 72874

CREATE SCHEMA doit être dans son propre lot, alors incorporez-le 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X