2017-12-16 1 views
1

SQL Serverにテーブルを作成するためのスクリプトを作成しています。スクリプトを書くときに、データベースを作成して削除したいと思います。問題は、オブジェクトがすでに存在しているというエラーが表示されることです。ここで 新しいSQL Serverデータベースにテーブルがすでに存在しています

は私のサンプルスクリプト

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) 

であり、私が得る出力は

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

(6 rows affected) 
listing tables 
table_name                              

はエラーです:

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

私は、Linuxのミントのマシン上でこれを実行して、インストールしたばかりのSQL Serverで、私はsqlcmdを使用します。私はテーブルを作成する前にdrop/deleteコマンドを置くことができると思いますが、これは最初に起こるべきではありません。ここで何が起こっているのですか?

答えて

0

オブジェクト存在チェック内でcreate table文をバインドします。この

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

ようにあなたは、動的SQLからUSE文を実行すると、データベースコンテキストは(マスター?)実行されたバッチが完了し、元のデータベースコンテキストに戻ります。 CREATE TABLEスクリプトにUSEを追加し、動的SQLを使用して実行する必要があります。

SET @command = N'USE' + QUOTENAME(@db_name) + N'; 
CREATE TABLE stuff(
    name VARCHAR(30) PRIMARY KEY NOT NULL, 
    weight INT, 
    quantity INT); 
'; 
関連する問題