表已存在于新的SQL Server数据库中

时间:2017-12-16 13:20:51

标签: sql-server sqlcmd

我正在编写一个脚本来在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 name=@db_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
  已经有一个名为' stuff'在数据库中。

我在Linux铸币机,新安装的SQL Server上运行,我使用sqlcmd。我想我可以在创建表之前放置一个drop/delete命令,但这不应该是开始的。这里发生了什么?

2 个答案:

答案 0 :(得分:2)

当您从动态SQL执行USE语句时,数据库上下文会在执行的批处理完成时恢复为原始数据库上下文(master?)。您需要在USE脚本中添加CREATE TABLE并使用动态SQL执行它:

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

答案 1 :(得分: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