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?
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