无法在开始块内创建架构

时间:2013-09-09 11:49:45

标签: sql sql-server

我完全难过了。我有以下块:

IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'Test')
BEGIN
    CREATE SCHEMA Test;
END;

如果我针对我们的SQL Server 2008运行此操作,我会在关键字'SCHEMA'附近获得“消息156,级别15,状态1,行3:不正确的语法”但是如果我仅运行CREATE SCHEMA命令,它有效。

此外,这也有效:

IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'Test')
BEGIN
    PRINT 'CREATE GOES HERE';
END;

我做错了什么?

4 个答案:

答案 0 :(得分:18)

错误信息在这里有点红色鲱鱼....执行以下操作以查看“真实”错误是什么:

SELECT * FROM sys.schemas
CREATE SCHEMA Test
  

Msg 111,Level 15,State 1,Line 2

     
    

'CREATE SCHEMA'必须是查询批处理中的第一个语句。

  

要解决此问题,您可以使用EXEC功能:

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Test')
  BEGIN
    EXEC ('CREATE SCHEMA Test;');
  END;

答案 1 :(得分:4)

你无法验证架构是否存在,你应该这样做:

IF NOT EXISTS(SELECT * FROM sys.schemas WHERE name = 'Test')
BEGIN
    execute('CREATE SCHEMA Test');
END;

原因是因为DB引擎在运行代码之前编译代码但不验证代码的逻辑。在编译引擎期间,您发现架构已存在,而不是出现错误。我的解决方案有效,因为DB不编译动态sql,所以它不知道你正在尝试创建现有的架构。

答案 2 :(得分:4)

试试这个 -

IF NOT EXISTS(SELECT 1 FROM sys.schemas WHERE name = 'Test')
BEGIN
    EXEC sys.sp_executesql N'CREATE SCHEMA Test;'
END

答案 3 :(得分:3)

如果需要在另一个数据库而不是当前上下文中创建模式,则应运行以下脚本。

set @myScript = 'exec '+ QUOTENAME(@DBName) + '..sp_executesql N''create schema MySchema'''
execute(@myScript)