Как я могу запросить, если схема базы данных существует - PullRequest
88 голосов
/ 22 октября 2008

В рамках нашего процесса сборки мы запускаем скрипт обновления базы данных при развертывании кода в 4 различных средах. Кроме того, так как тот же запрос будет добавлен до тех пор, пока мы не выпустим релиз в производство, он имеет , чтобы иметь возможность многократно запускаться в данной базе данных. Как это:

IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
  CREATE TABLE [Table]
  (...)
END

В настоящее время у меня есть оператор создания схемы в сценарии развертывания / сборки. Где я могу запросить существование схемы?

Ответы [ 4 ]

147 голосов
/ 06 февраля 2009

@ bdukes подходит для определения того, существует ли схема, но приведенное выше утверждение не будет работать в SQL Server 2005. CREATE SCHEMA <name> необходимо запустить в своем собственном пакете. Обходной путь - выполнить оператор CREATE SCHEMA в exec.

Вот что я использовал в своих скриптах сборки:

IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = '<name>')
BEGIN
    -- The schema must be run in its own batch!
    EXEC( 'CREATE SCHEMA <name>' );
END
144 голосов
/ 22 октября 2008

Вы ищете sys.schemas ?

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'jim')
BEGIN
EXEC('CREATE SCHEMA jim')
END

Обратите внимание, что CREATE SCHEMA должен быть запущен в отдельной партии (для ответа ниже )

1 голос
/ 22 июня 2017

Просто чтобы быть экстра"оборонительным", следующая версия генерирует ошибку преобразования типов, чтобы учесть возможность (хотя и маловероятную)> 1 совпадения Schema, аналогично тому, как код проверки часто преднамеренно Бросьте Исключение, потому что я считаю, что это хорошо, и я полагаю, что это «лучшая практика» для учета всех возможных возвращаемых результатов, хотя и маловероятных, и даже если это просто для генерации фатального исключения, потому что известные эффекты остановки обработки обычно лучше, чем неизвестное каскадирование последствия незапертых ошибок. Поскольку это маловероятно, я не думал, что стоит отдельная Count проверка + Throw или Try - Catch - Throw для создания более удобной для пользователя фатальной ошибки, но все же фатальной ошибки тем не менее.

SS 2005-:

declare @HasSchemaX bit
set @HasSchemaX = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end

СС 2008+:

declare @HasSchemaX bit = case (select count(1) from sys.schemas where lower(name) = lower('SchemaX')) when 1 then 1 when 0 then 0 else 'ERROR' end

Тогда:

if @HasSchemaX = 1
begin
   ...
end -- if @HasSchemaX = 1
0 голосов
/ 15 марта 2019

Это старый, поэтому я чувствую себя обязанным добавить: Для SQL SERVER 2008+ Все это работает (для выбранной части), затем используйте EXECUTE('CREATE SCHEMA <name>'), чтобы фактически создать его при отрицательных результатах.

DECLARE @schemaName sysname = 'myfunschema';
-- shortest
If EXISTS (SELECT 1 WHERE SCHEMA_ID(@schemaName) IS NOT NULL)
PRINT 'YEA'
ELSE
PRINT 'NOPE'

SELECT DB_NAME() AS dbname WHERE SCHEMA_ID(@schemaName) IS NOT NULL -- nothing returned if not there

IF NOT EXISTS ( SELECT  top 1 *
                FROM    sys.schemas
                WHERE   name = @schemaName )
PRINT 'WOOPS MISSING'
ELSE
PRINT 'Has Schema'

SELECT SCHEMA_NAME(SCHEMA_ID(@schemaName)) AS SchemaName1 -- null if not there otherwise schema name returned

SELECT SCHEMA_ID(@schemaName) AS SchemaID1-- null if not there otherwise schema id returned


IF EXISTS (
    SELECT sd.SchemaExists 
    FROM (
        SELECT 
            CASE 
                WHEN SCHEMA_ID(@schemaName) IS NULL THEN 0
                WHEN SCHEMA_ID(@schemaName) IS NOT NULL THEN 1
                ELSE 0 
            END AS SchemaExists
    ) AS sd
    WHERE sd.SchemaExists = 1
)
BEGIN
    SELECT 'Got it';
END
ELSE
BEGIN
    SELECT 'Schema Missing';
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...