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

时间:2011-04-21 18:09:29

标签: sql sql-server tsql

我生成了一个脚本,它为这个数据库创建了所有用户和模式,当我用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

5 个答案:

答案 0 :(得分:94)

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

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

答案 1 :(得分:30)

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

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

答案 2 :(得分:8)

它需要在自己的批次中。您可以将其包装在EXEC('')

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

我认为该要求的原因与版本6.5(at least that's what it says here)中引入的CREATE SCHEMA语法的旧版本有关。

答案 3 :(得分:4)

有时(始终)不允许使用动态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

答案 4 :(得分:3)

CREATE SCHEMA必须在其自己的批处理中,因此将其嵌入EXEC并且您应该没问题。

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