我完全难过了。我有以下块:
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;
我做错了什么?
答案 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)