Domanda

Come parte del nostro processo di compilazione, eseguiamo uno script di aggiornamento del database mentre distribuiamo il codice in 4 ambienti diversi. Inoltre, poiché la stessa query verrà aggiunta fino a quando non rilasciamo una versione in produzione, deve poter essere eseguita più volte su un determinato database. In questo modo:

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

Attualmente ho una dichiarazione dello schema di creazione nello script deploy / build. Dove posso richiedere l'esistenza di uno schema?

È stato utile?

Soluzione

Stai cercando sys.schemas ?

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

Nota che CREATE SCHEMA deve essere eseguito nel proprio batch (per la risposta di seguito )

Altri suggerimenti

@bdukes è giusto per determinare se lo schema esiste, ma la dichiarazione sopra non funzionerà in SQL Server 2005. CREATE SCHEMA <name> deve essere eseguita nel proprio batch. Una soluzione è eseguire l'istruzione CREATE SCHEMA in un exec.

Ecco cosa ho usato nei miei script di build:

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

Solo per essere extra " difensivo " ;, la versione seguente genera un errore di conversione del tipo per tenere conto della possibilità (per quanto improbabile) di > 1 corrispondente a Schema è simile al modo in cui il codice di convalida spesso genera intenzionalmente un'eccezione perché credo che sia buono e credo che sia & Quot; 'best practice' & Quot; tenere conto di tutti i possibili risultati di restituzione comunque improbabili e anche se si tratta solo di generare un'eccezione fatale perché gli effetti noti dell'arresto dell'elaborazione sono generalmente migliori degli effetti a cascata sconosciuti di errori non intrappolati. Poiché è altamente improbabile, non pensavo che valesse la pena di un Count controllo separato + Throw o Try - Catch - <=> per generare un errore fatale più user-friendly ma comunque fatale comunque.

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

SS 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

Quindi:

if @HasSchemaX = 1
begin
   ...
end -- if @HasSchemaX = 1

Questo è vecchio, quindi mi sento in dovere di aggiungere: Per SQL SERVER 2008+ Questi funzionano tutti (per la parte selezionata), quindi utilizzare EXECUTE('CREATE SCHEMA <name>') per crearlo effettivamente su risultati negativi.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top