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

#sql #sql-server #tsql

#sql #sql-server #tsql

Вопрос:

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

Комментарии:

1. Я уточнил, что могу обернуть инструкцию CREATE SCHEMA с помощью EXECUTE, чтобы позволить инструкции работать. Смотрите EXECUTE(‘СОЗДАТЬ СХЕМУ [acme] АВТОРИЗАЦИЯ [dbo]’) msdn.microsoft.com/en-us/library/ms189462.aspx

2. Это чушь собачья … конечно, мы не все загромождаем наш код бессмысленными инструкциями EXEC?

3. Если бы только create schema поддерживался if exists предикат… ;_;

Ответ №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:

Иногда (всегда) вам не разрешается использовать динамический SQL, поэтому использование EXEC — не лучший подход. Использование GO инструкции может улучшить работу:

 USE [MyDB]
GO

IF (SCHEMA_ID('MySchema') IS NOT NULL)
BEGIN
    DROP SCHEMA [MySchema];
END

GO

CREATE SCHEMA [MySchema] AUTHORIZATION [dbo]

GO
  

Комментарии:

1. Если у вас уже есть таблицы для этой схемы, вы не можете удалить ее, не удалив таблицы (или другой объект).

Ответ №5:

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

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