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


70

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

我已经清除了我可以用EXECUTE包装CREATE SCHEMA语句以允许该语句起作用的方法。请参阅EXECUTE('创建模式[acme]授权[dbo]')msdn.microsoft.com/en-us/library/ms189462.aspx
Brennan

3
这是胡说八道...肯定不是我们都用毫无意义的EXEC语句弄乱了我们的代码吗?
克里斯·贝伦斯

如果仅create schema支持if exists谓词...; _;
伊恩·肯普

Answers:


115

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

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

39

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

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


4

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

1
如果您已经有该模式的表,则不能删除它而不删除表(或其他对象)。
marko982'4

3

CREATE SCHEMA必须在自己的批次中,因此将其嵌入到中就EXEC可以了。

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'acme')) 
BEGIN
    EXEC ('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
END
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.