Подтвердить что ты не робот

Почему я не могу использовать "создать схему" в блоке begin/end в SQL Management Studio?

Я создал script, который создает всех пользователей и схемы для этой базы данных, и когда я завершаю инструкции CREATE с помощью проверки IF EXISTS, я обнаружил, что он не разрешает вызов CREATE SCHEMA в блоке BEGIN/END. Он жалуется, что это недопустимый синтаксис. Но я могу запустить команду самостоятельно. Ниже приведен пример кода. Я использую SQL Server 2008 и Management Studio R2. Почему этот недопустимый синтаксис?

--DROP SCHEMA [acme]

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

Ответ 1

Создание схемы должно быть единственным выражением в пакете. Один из способов обойти это так:

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

Ответ 2

Вот еще более простое решение (более простая проверка):

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

Ответ 3

Он должен быть в своей собственной партии. Вы можете обернуть его в EXEC('')

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

Я считаю, что причина этого требования связана с более старой версией синтаксиса CREATE SCHEMA, представленной в версии 6.5 (по крайней мере, тем, что здесь сказано).

Ответ 4

CREATE SCHEMA должен быть в нем собственный пакет, поэтому вставьте его внутри EXEC, и вы должны быть в порядке.

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