2011-04-21 41 views
43

我生成了一個腳本,它爲這個數據庫創建所有用戶和模式,當我用CRE EXETS檢查包裝CREATE語句時,我發現它不允許CREATE SCHEMA調用在BEGIN/END塊中運行。它抱怨說這是無效的語法。但我可以自行運行命令。代碼示例如下。我正在使用SQL Server 2008和Management Studio R2。爲什麼這是無效的語法?爲什麼我不能在SQL Management Studio的開始/結束塊中使用「create schema」?

--DROP SCHEMA [acme] 

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme')) 
BEGIN 
    CREATE SCHEMA [acme] AUTHORIZATION [dbo] 
END 
+0

我已經清除,我可以換用EXECUTE允許語句工作create schema語句。請參閱EXECUTE('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')http://msdn.microsoft.com/en-us/library/ms189462.aspx – Brennan 2011-04-21 18:16:26

+1

這是馬屁吧...當然,我們並不是都混淆我們的代碼用無意義的EXEC語句? – 2016-04-26 21:32:38

回答

76

模式創建必須是批處理中唯一的語句。要解決它的方法之一是,像這樣:

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme')) 
BEGIN 
    EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]') 
END 
8

它需要在它自己的批次中。你可以用它在EXEC('')

EXEC('CREATE SCHEMA [acme] AUTHORIZATION [dbo]') 

相信對於需求的原因是與舊版本的CREATE SCHEMA語法6.5版本(at least that's what it says here)介紹的。

3

CREATE SCHEMA必須在它自己的批次,所以將其嵌入一個EXEC內,你應該確定。

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme')) 
BEGIN 
    EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]') 
END 
22

這裏有一個更簡單的解決方案(簡單的檢查):

IF (SCHEMA_ID('acme') IS NULL) 
BEGIN 
    EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]') 
END 
相關問題