Почему я не могу использовать «создать схему» в начале / конце блока в SQL Management Studio? - PullRequest
54 голосов
/ 21 апреля 2011

Я сгенерировал скрипт, который создает всех пользователей и схемы для этой базы данных, и когда я обертываю операторы 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

Ответы [ 4 ]

95 голосов
/ 21 апреля 2011

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

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme')) 
BEGIN
    EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
END
30 голосов
/ 15 апреля 2013

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

IF (SCHEMA_ID('acme') IS NULL) 
BEGIN
    EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
END
8 голосов
/ 21 апреля 2011

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

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

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

3 голосов
/ 21 апреля 2011

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

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme')) 
BEGIN
    EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...