Frage

OK, so Sybase (12.5.4) lassen mich gehen Sie wie folgt eine Tabelle zu löschen, wenn sie bereits vorhanden ist:

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

Aber wenn ich versuche, das gleiche mit Tabellenerstellung zu tun, bekomme ich immer davor gewarnt, dass die Tabelle bereits vorhanden ist, denn es ging voran und versucht, meine Tabelle zu erstellen und ignoriert die bedingte Anweisung. Versuchen Sie einfach zweimal die folgende Anweisung ausgeführt wird, werden Sie sehen, was ich meine:

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

die oben Laufen erzeugt den folgenden Fehler:

  

SQL Server-Fehler auf (localhost)   Fehler: 2714 bei Zeile: 7 Nachricht: Es gibt   bereits ein Objekt mit dem Namen ‚a_table‘ in   die Datenbank.

Was ist das Abkommen mit dem?!

War es hilfreich?

Lösung

Die einzige Abhilfe, die ich mit so weit habe kommen verwenden ausführen sofort:

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

wirkt wie ein Zauber, fühlt sich wie ein schmutziger Hack.

Andere Tipps

Es gibt keinen anderen Weg, als create table in execute("create table ...") Aufruf

SYBASE Handbuch sagt:

  

Wenn ein create table-Befehl erfolgt innerhalb einer if ... else-Block oder ein   while-Schleife, erstellt Adaptive Server das Schema für die Tabelle vor   Bestimmen, ob die Bedingung erfüllt ist. Dies kann zu Fehlern führen, wenn   die Tabelle bereits vorhanden. Um diese Situation zu vermeiden, entweder stellen Sie sicher ein   Ansicht mit dem gleichen Namen existiert nicht bereits in der Datenbank oder Verwendung   eine Ausführungsanweisung, wie folgt:

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

ich nicht getestet haben, aber man könnte versuchen, die Tabelle in eine sproc Anweisung erstellen zu bewegen. Sie könnten dann das sproc bedingt nennen basierend auf Ihrer bestehenden if-Anweisung.

Weisen Sie die "CREATE TABLE" Anweisung in einem char @variable und führen Sie dann eine exec (@variable).

Wenn Sie wollen immer die Tabelle erstellen, aber es bedingt fallen, können Sie:

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

CREATE TABLE tableNameWithUserPart ...

Es sind keine Abhilfen erforderlich;)

Nach der Dokumentation:

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 ]

Verwenden Sie einfach die WENN NICHT VORHANDEN.

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

Das funktioniert, wenn getestet mit Sybase überall 10,01 :

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

Versuchen Sie Anfang und Ende verwendet wird.

WENN NICHT VORHANDEN (     SELECT Count (1)     FROM sysobjects     WHERE name = 'a_table'     UND type = 'U' ) BEGIN CREATE TABLE a_table (     col1 int nicht null,     col2 int null ) END GO

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top