Domanda

Ho un sacco di codice che sto cercando di eseguire dove sto interrogando la tabella sysobjects per verificare se esiste un oggetto prima di rilasciarlo e crearlo di nuovo.

Problema, a volte se vado:

if not exists (select name from sysobjects o where o.name = 'my_table' and o.type =  'U') 
CREATE TABLE my_table (..)
go

funziona, non preoccuparti. Tuttavia, quando sono tornato per eseguirlo di nuovo, ricevo questo adorabile errore:

SQL Server Error on (myserver) Error:2714 at Line:10 Message:There is already an object named 'my_table' in the database.

Grazie, programmatore SQL. In realtà ti ho chiesto di non creare questa tabella se esiste già. -_-

Qualche idea?

È stato utile?

Soluzione

la logica di ciò che stai facendo non sembra del tutto corretta. in base alla tua dichiarazione:

" Sto cercando di eseguire dove sto interrogando la tabella sysobjects per verificare se esiste un oggetto prima di rilasciarlo e crearlo di nuovo "

dovresti semplicemente fare una cancellazione seguita da una creazione. In questo modo è in genere meglio perché garantisce che la tabella venga aggiornata. se la tabella esisteva e tu avessi delle modifiche, probabilmente non otterrai ciò che desideri.

Il problema immediato in cui ti imbatti è una presunta proprietà db che non era coerente tra le esecuzioni.

basato sul chiarimento che segue: ecco cosa puoi fare:

SE ESISTE (SELEZIONA * DA sys.objects DOVE object_id = OBJECT_ID (N '[dbo]. [XXXX]') AND digita (N'U ')) DROP TABLE [dbo]. [XXXX] GO

CREATE TABLE [dbo]. [XXXX (... GO

puoi ripeterlo più e più volte ...

Altri suggerimenti

Il passaggio di convalida dell'oggetto parser sybase è globale e non basato sulla valutazione condizionale. Anche se il tuo codice non può eseguire CREATE TABLE, l'istruzione viene comunque verificata per la sintassi e l'applicabilità che non riescono quando il sistema vede che la tabella esiste già.

L'unico modo per aggirare ciò che conosco è quello di inserire le istruzioni create all'interno di un EXEC () che verrebbero valutate solo se la sezione fosse eseguita.

sì, l'intero batch di SQL viene normalizzato e compilato in modo da creare un "piano di esecuzione" per l'intero lotto. Durante la normalizzazione, il "possibile" " crea tabella " L'istruzione è un problema se esiste già in fase di compilazione.

La mia soluzione: rinomina -

se esiste (selezionare 1 da ....) inizio   drop table xyz   crea tabella xyz_zzzz (...)   exec sp_rename 'xyz_zzzz', 'xyz' end

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