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)
它需要在自己的批次中.你可以把它包起来EXEC('')
EXEC('CREATE SCHEMA [acme] AUTHORIZATION [dbo]')
Run Code Online (Sandbox Code Playgroud)
我相信这个要求的原因与CREATE SCHEMA版本6.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)
有时(总是)你不允许使用动态 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)