2011-09-18 97 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