考虑以下脚本:
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
,那一切都很顺利。
问题是,我该如何解决它,以便能够立即运行整个脚本而没有错误?
答案 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为您选择正确的数据库。然后在该数据库上运行脚本