Ответ 1
Создание схемы должно быть единственным выражением в пакете. Один из способов обойти это так:
IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme'))
BEGIN
EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
END
Я создал 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
Создание схемы должно быть единственным выражением в пакете. Один из способов обойти это так:
IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme'))
BEGIN
EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
END
Вот еще более простое решение (более простая проверка):
IF (SCHEMA_ID('acme') IS NULL)
BEGIN
EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
END
Он должен быть в своей собственной партии. Вы можете обернуть его в EXEC('')
EXEC('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
Я считаю, что причина этого требования связана с более старой версией синтаксиса CREATE SCHEMA
, представленной в версии 6.5 (по крайней мере, тем, что здесь сказано).
CREATE SCHEMA
должен быть в нем собственный пакет, поэтому вставьте его внутри EXEC
, и вы должны быть в порядке.
IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme'))
BEGIN
EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
END