#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