如何在一个脚本中创建数据库和USE语句?

时间:2011-09-18 17:54:17

标签: sql sql-server sql-server-2008 exec

考虑以下脚本:

DECLARE @path varchar(MAX)
DECLARE @script varchar(MAX)
SET @path = (SELECT physical_name FROM sys.master_files where name = 'master');
SET @path = REPLACE(@path, 'master.mdf', '');
SELECT @path;

SET @script = 
'CREATE DATABASE test
 ON PRIMARY
 (NAME = test_primary,
  FILENAME = ''' + @path + 'test_primary.mdf'',
  SIZE = 10MB,
  FILEGROWTH = 10MB)';

exec(@script);

USE test

当我尝试一次运行它时,我收到一个错误:

Msg 911, Level 16, State 1, Line 31
Database 'test' does not exist. Make sure that the name is entered correctly.

如果我首先运行exec然后单独运行USE,那一切都很顺利。

问题是,我该如何解决它,以便能够立即运行整个脚本而没有错误?

3 个答案:

答案 0 :(得分:3)

SQL Server一次编译一个批处理的代码。编译代码时,数据库不存在。

use test之前添加batch separator

DECLARE @path varchar(MAX)
DECLARE @script varchar(MAX)
SET @path = (SELECT physical_name FROM sys.master_files where name = 'master');
SET @path = REPLACE(@path, 'master.mdf', '');
SELECT @path;

SET @script = 
'CREATE DATABASE test
 ON PRIMARY
 (NAME = test_primary,
  FILENAME = ''' + @path + 'test_primary.mdf'',
  SIZE = 10MB,
  FILEGROWTH = 10MB)';

exec(@script);

GO

USE test

答案 1 :(得分:3)

如果要从其中一个SQL Server查询工具(例如企业管理器,管理工作室或sqlcmd)执行语句,则在GO之前插入语句USE test命令。这会将命令分成不同的批次。如果您通过其中一个程序客户端执行脚本,则必须通过拆分脚本单独执行批处理。

答案 2 :(得分:0)

不应该使用脚本的顶部吗?

USE为您选择正确的数据库。然后在该数据库上运行脚本