2009-06-17 5 views
2

Ich habe viel Code Ich versuche, wo ich die sysobjects-Tabelle Abfrage, um zu überprüfen, ob ein Objekt existiert, bevor ich es ablegen und neu erstellen. manchmalWarum funktionieren IF EXISTS nicht?

Ausgabe zu sein, wenn ich gehen:

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

es funktioniert, keine Sorgen. Als ich jedoch kam es wieder zu laufen, ich diesen schönen Fehler:

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

Vielen Dank für die, SQL-Programmierer. Ich habe Sie tatsächlich gebeten, diese Tabelle nicht zu erstellen, wenn sie bereits existiert. -_-

Irgendwelche Ideen?

Antwort

1

die Logik zu dem, was Sie tun, scheint nicht ganz richtig. basierend auf Ihre Aussage:

„Ich versuche, wo ich die Abfrage der Tabelle sysobjects auszuführen besteht zu überprüfen, ob ein Objekt, bevor ich es löschen und erstellen Sie es erneut“

Sie sollten einfach tun, um eine Lösch gefolgt von eine Schaffung. Dieser Weg ist normalerweise besser, weil dadurch sichergestellt wird, dass die Tabelle aktualisiert wird. Wenn die Tabelle existierte und Sie Änderungen hatten, bekommen Sie wahrscheinlich nicht, was Sie wollen.

Das unmittelbare Problem, auf das Sie stoßen, ist eine angenommene Datenbankeigentümerschaft, die zwischen Läufen nicht konsistent war.

auf der Grundlage Ihrer Klärung unten - hier ist das, was Sie tun können:

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID (N '[dbo] [XXXX].') Und geben (N'U ')) DROP TABLE [dbo]. [XXXX] GO

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

können Sie dies über laufen und immer wieder ..

+0

Ich habe beide versucht "Bitte entfernen Sie Ihre vorherige Version, wenn Sie eine, dann diese Version installieren" und "Bitte installieren Sie nur diese Version, wenn Sie keine vorherige haben ". Ich möchte nur ein Skript, das ich immer wieder (zum Testen) laufen kann, ohne etwas auf dem Weg zu brechen (mehr Systemcodes, Systemfehler versuchen, Einschränkungen zu kopieren, etc.) – glasnt

+0

Ihre Logik falsch war. die falls vorhanden sollte fallen nicht erstellt werden. – mson

+0

Das 'Wenn vorhanden' wird zum Löschen verwendet und dann erstellt. Sonst schafft es es einfach. Meine Logik ist nicht falsch. – glasnt

0

Der Validierungspass für Sybase-Parserobjekte ist global und basiert nicht auf bedingter Auswertung. Obwohl Ihr Code CREATE TABLE nicht ausführen kann, wird die Anweisung immer noch auf Syntax und Anwendbarkeit überprüft, was fehlschlägt, wenn das System erkennt, dass die Tabelle bereits existiert.

Der einzige Weg, den ich kenne, ist, Ihre create-Anweisungen in eine EXEC() zu schreiben, die nur ausgewertet würde, wenn der Abschnitt ausgeführt wurde.

+0

das klingt richtig .. aber ich habe keine Kopie von Sybase, um dies zu testen auf –

0

ja, der gesamte Batch von SQL ist nein ralisiert und kompiliert, um einen "Ausführungsplan" für die gesamte Charge zu erstellen. Während der Normalisierung ist die "mögliche" "create table" -Anweisung ein Problem, wenn sie bereits zur Kompilierungszeit existiert.

Meine Lösung: umbenennen -

falls vorhanden (1 wählen Sie aus ....) beginnen drop table xyz Tabelle xyz_zzzz (...) exec sp_rename 'xyz_zzzz', 'xyz' erstellen Ende