2017-12-16 15 views
1

Ich schreibe ein Skript, um eine Reihe von Tabellen in SQL Server zu erstellen. Während ich das Skript schreibe, möchte ich die Datenbank erstellen und löschen. Das Problem ist, dass ich eine Fehlermeldung bekomme, dass das Objekt bereits existiert.Tabelle existiert bereits in einer neuen SQL Server-Datenbank

Hier ist mein Beispielskript

DECLARE @db_name varchar(20); 
DECLARE @command varchar(100); 
SET @db_name='testdb'; 

SET @command='DROP DATABASE ' + @db_name 
IF EXISTS(SELECT * FROM sys.databases WHERE [email protected]_name) 
    exec(@command) 

SET @command='CREATE DATABASE ' + @db_name 
EXEC(@command) 

--listing databaes 
SELECT name from master.dbo.sysdatabases 
-- using our database 
SET @command='USE ' + @db_name 
EXEC(@command) 

PRINT 'listing tables' 
SET @command = 'SELECT table_name FROM ' + @db_name + '.INFORMATION_SCHEMA.TABLES WHERE table_type = "base TABLE"' 
EXEC(@command) 
CREATE TABLE stuff(
    name VARCHAR(30) PRIMARY KEY NOT NULL, 
    weight INT, 
    quantity INT) 

und der Ausgang I erhalten

name                                
------------  
master                               
tempdb                               
model                               
msdb                                
testdb                               
SW 

(6 rows affected) 
listing tables 
table_name                              

Fehler:

Msg 2714, Level 16, State 6, Server Orange, Line 22
There is already an object named 'stuff' in the database.

ich diese Minze Maschine auf einem Linux laufen, ein frisch installiertes SQL Server und ich verwende sqlcmd. Ich denke, ich kann einen drop/delete Befehl vor dem Erstellen der Tabelle setzen, aber das sollte nicht passieren, mit zu beginnen. Was geht hier vor sich?

Antwort

0

binden Sie die create table-Anweisung innerhalb einer Objekt-Existenzprüfung. wie dies

IF OBJECT_ID('stuff') IS NULL 
BEGIN 

CREATE TABLE stuff(
    name VARCHAR(30) PRIMARY KEY--NOT NULL is not needed as the primary key does not allow NULL, 
    weight INT, 
    quantity INT) 

END 
2

Wenn Sie eine USE Anweisung von dynamischen SQL ausführen, kehrt der Datenbankkontext auf den ursprünglichen Datenbankkontext zurück (Master?), wenn die ausgeführte Batch abgeschlossen ist. Sie müssen dem Skript USE ein CREATE TABLE-Skript hinzufügen und dieses auch mit dynamischem SQL ausführen:

SET @command = N'USE' + QUOTENAME(@db_name) + N'; 
CREATE TABLE stuff(
    name VARCHAR(30) PRIMARY KEY NOT NULL, 
    weight INT, 
    quantity INT); 
'; 
Verwandte Themen