【发布时间】:2012-09-05 00:16:08
【问题描述】:
我有一段看起来有点像这样的 SQL
IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = '{FOO}')
BEGIN
EXECUTE ('CREATE DATABASE {FOO}')
ALTER DATABASE {FOO} SET AUTO_CLOSE OFF
END
{FOO} 在运行时被替换为用户可配置数据库的名称。逻辑是如果数据库已经存在,我不想创建它。
如果{FOO} 是tempdb,那么查询运行时会失败
无法在数据库“tempdb”中设置选项“AUTO_CLOSE”。
我的问题是为什么我会失败? SELECT * FROM sys.databases WHERE name = 'tempdb' 返回零结果,所以我的整个 BEGIN/END 对肯定不应该运行吗?事实上,如果我在 begin 和 end 之间放置 print 语句,我看不到任何输出。
我的猜测是 SQL Server 正在对 SQL 进行某种 linting 以确保我不会乱用 tempdb?我已经通过使用EXECUTE 解决了这个问题,但我有点困惑为什么我必须这样做!
【问题讨论】:
-
听起来像是解析问题。您的代码当前已损坏 -
ALTER是否在字符串中?如果没有,请尝试将其作为动态字符串的一部分。 -
抱歉,打错字了,我更正了。更改是字符串的一部分。
标签: sql sql-server sql-server-2008