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

Bre*_*nan 62 sql t-sql sql-server

我生成了一个脚本,它为这个数据库创建了所有用户和模式,当我用IF EXISTS检查包装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
Run Code Online (Sandbox Code Playgroud)

Tom*_*m H 102

架构创建必须是批处理中唯一的语句.绕过它的一种方法是这样的:

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


Mar*_*eld 34

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

IF (SCHEMA_ID('acme') IS NULL) 
BEGIN
    EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
END
Run Code Online (Sandbox Code Playgroud)


Mar*_*ith 8

它需要在自己的批次中.你可以把它包起来EXEC('')

EXEC('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
Run Code Online (Sandbox Code Playgroud)

我相信这个要求的原因与CREATE SCHEMA版本6.5中引入的旧版本语法有关(至少它就是这里所说的).


Joe*_*lli 5

CREATE SCHEMA必须在它自己的批次中,因此将其嵌入到 an 中EXEC,应该没问题。

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


Zav*_*yan 5

有时(总是)你不允许使用动态 SQL,所以使用EXEC不是最好的方法。使用GO语句可以做得更好:

USE [MyDB]
GO

IF (SCHEMA_ID('MySchema') IS NOT NULL)
BEGIN
    DROP SCHEMA [MySchema];
END

GO

CREATE SCHEMA [MySchema] AUTHORIZATION [dbo]

GO
Run Code Online (Sandbox Code Playgroud)