2011-04-21 15 views
43

He generado una secuencia de comandos que crea todos los usuarios y esquemas para esta base de datos y cuando envuelvo las instrucciones CREATE con una comprobación IF EXISTS, encuentro que no permite ejecutar la llamada CREATE SCHEMA en el bloque BEGIN/END. Se queja de que es una sintaxis inválida. Sin embargo, puedo ejecutar el comando por sí mismo. Una muestra del código está debajo. Estoy usando SQL Server 2008 y Management Studio R2. ¿Por qué esta sintaxis inválida?¿Por qué no puedo usar "create schema" en un bloque begin/end en SQL Management Studio?

--DROP SCHEMA [acme] 

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

me he aclarado que puedo envolver la declaración CREATE SCHEMA con EXECUTE para permitir la declaración de trabajar. Consulte EJECUTAR ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]') http://msdn.microsoft.com/en-us/library/ms189462.aspx – Brennan

+1

Esto es una mierda ... seguramente no estamos saturando nuestro código con declaraciones EXEC sin sentido? –

Respuesta

76

Las creaciones de esquema deben ser la única declaración en un lote. Una manera de conseguir alrededor de él es así:

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

Tiene que estar en su propio lote. Usted puede envolver en EXEC('')

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

Creo que la razón por la exigencia es algo que ver con una versión anterior de la sintaxis CREATE SCHEMA introducido en la versión 6.5 (at least that's what it says here).

3

CREATE SCHEMA debe estar en su propio lote, por lo incrustarlo dentro de un EXEC y que debe estar bien.

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

Aquí es una solución aún más simple (simple comprobación):

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