9

我完全被难住了。我有以下块:

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

如果我对我们的 SQL Server 2008 运行此命令,我会得到“消息 156,级别 15,状态 1,第 3 行:关键字 'SCHEMA' 附近的语法不正确”,但如果我只运行该CREATE SCHEMA命令,它就可以工作。

此外,这有效:

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

我究竟做错了什么?

4

4 回答 4

23

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

SELECT * FROM sys.schemas
CREATE SCHEMA Test

消息 111,第 15 级,状态 1,第 2 行

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

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

IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'Test')
  BEGIN
    EXEC ('CREATE SCHEMA Test;');
  END;
于 2013-09-09T11:52:23.207 回答
9

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

设置 @myScript = 'exec'+ QUOTENAME(@DBName) + '..sp_executesql N''创建模式 MySchema'''
执行(@myScript)
于 2015-12-15T03:05:29.263 回答
4

试试这个——

IF NOT EXISTS(SELECT 1 FROM sys.schemas WHERE name = 'Test')
BEGIN
    EXEC sys.sp_executesql N'CREATE SCHEMA Test;'
END
于 2013-09-09T12:30:10.783 回答
4

您无法以这种方式验证模式是否存在,您应该这样做:

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

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

于 2013-09-09T11:51:51.470 回答