2011-09-18 99 views
1

请看下面的代码:创建数据库,并使用语句在一个脚本

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和然后单独运行使用它一切正常。

问题是,我该如何解决它,以便可以一次运行整个脚本而没有错误?

回答

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 
+0

谢谢,它现在可行。 – noname

0

Souldn'U USE是在脚本的顶部?

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

+1

他正在创建'test'数据库,然后试着用它做点什么 – jeroenh

3

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

+0

谢谢你的正确答案,但对我来说,Mikael Eriksson的答案似乎更精确一些。 +1无论如何) – noname