Wie erstelle ich bedingt eine Tabelle in Sybase (SQL)?
-
08-07-2019 - |
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?!
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