Domanda

OK, quindi Sybase (12.5.4) mi permetterà di fare quanto segue per DROP una tabella se esiste già:

IF EXISTS (
    SELECT 1
    FROM sysobjects
    WHERE name = 'a_table'
    AND type = 'U'
)
DROP TABLE a_table
GO

Ma se provo a fare lo stesso con la creazione della tabella, mi viene sempre avvertito che la tabella esiste già, perché è andata avanti e ha cercato di creare la mia tabella e ha ignorato l'istruzione condizionale. Prova a eseguire due volte la seguente dichiarazione, vedrai cosa intendo:

IF NOT EXISTS (
    SELECT 1
    FROM sysobjects
    WHERE name = 'a_table'
    AND type = 'U'
)
CREATE TABLE a_table (
    col1 int not null,
    col2 int null
)
GO

L'esecuzione di quanto sopra produce il seguente errore:

  

Errore di SQL Server su (localhost)   Errore: 2714 alla riga: 7 Messaggio: c'è   già un oggetto chiamato 'a_table' in   il database.

Qual è il problema ?!

È stato utile?

Soluzione

L'unica soluzione che ho escogitato finora è usare execute immediate:

IF NOT EXISTS (
    SELECT 1
    FROM sysobjects
    WHERE name = 'a_table'
    AND type = 'U'
)
EXECUTE("CREATE TABLE a_table (
    col1 int not null,
    col2 int null
)")
GO

funziona come un incantesimo, sembra un trucco sporco.

Altri suggerimenti

Non c'è altro modo che chiamare create table in execute (" create table ... ")

SYBASE Manual dice:

  

Quando si verifica un comando create table all'interno di un blocco if ... else o a   while loop, Adaptive Server crea lo schema per la tabella precedente   determinare se la condizione è vera. Ciò può causare errori se   la tabella esiste già. Per evitare questa situazione, assicurarsi che a   la vista con lo stesso nome non esiste già nel database o nell'uso   una dichiarazione di esecuzione, come segue:

if not exists
    (select * from sysobjects where name="my table")
begin
execute "create table mytable(x int)"
end

Non l'ho provato, ma potresti provare a spostare l'istruzione create table in uno sproc. È quindi possibile chiamare condizionalmente tale sproc in base all'istruzione if esistente.

Assegna la " CREATE TABLE " in un char @variable e quindi fare un EXEC (@variable).

Se vuoi creare sempre la tabella, ma rilasciarla in modo condizionale, puoi usare:

IF(SELECT count(*) FROM sysobjects WHERE name="tableNameWithoutUserPart") > 0
    DROP TABLE tableNameWithUserPart
GO

CREATE TABLE tableNameWithUserPart ...

Non sono necessarie soluzioni alternative;)

Secondo la documentazione:

CREATE [ GLOBAL TEMPORARY ] TABLE [ IF NOT EXISTS ] [ owner.]table-name
( { column-definition | table-constraint | pctfree }, ... )
[ { IN | ON } dbspace-name ]
[ ENCRYPTED ]
[ ON COMMIT { DELETE | PRESERVE } ROWS
   | NOT TRANSACTIONAL ]
[ AT location-string ]
[ SHARE BY ALL ]

Usa solo SE NON ESISTE.

IF object_id('a_table') IS NULL
BEGIN
    CREATE TABLE a_table (
        col1 int not null,
        col2 int null
    ) 
END

Funziona quando testato con Sybase ovunque 10.01 :

if not exists(select * from SysColumns where tname = 'AAA') then create table DBA.AAA(  UNIQUEID integer not null ) END IF ;

Prova a usare Begin and End.

SE NON ESISTE (     SELECT Count (1)     DA sysobjects     WHERE name = 'a_table'     AND type = 'U' ) BEGIN CREATE TABLE a_table (     col1 int non null,     col2 int null ) FINE GO

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top