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