为什么我不能在SQL Management Studio的开始/结束块中使用“创build模式”?

我生成了一个脚本,创build这个数据库的所有用户和模式,当我用CRE EXETS检查包装CREATE语句时,我发现它不允许CREATE SCHEMA调用在BEGIN / END块中运行。 它抱怨说这是无效的语法。 但是我可以自己运行这个命令。 代码示例如下。 我正在使用SQL Server 2008和Management Studio R2。 为什么这是无效的语法?

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

模式创build必须是批处理中唯一的语句。 解决这个问题的一种方法是这样的:

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

这是一个更简单的解决scheme(更简单的检查):

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

它需要在自己的批次。 你可以把它包装在EXEC('')

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

我相信这个需求的原因是在版本6.5中引入了一个较旧版本的CREATE SCHEMA语法( 至less在这里是这么说的 )。

CREATE SCHEMA必须在它自己的批处理,所以embedded到一个EXEC ,你应该没问题。

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