Come posso creare in modo condizionale una tabella in Sybase (SQL)?
-
08-07-2019 - |
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 ?!
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