多语句事务中不允许使用 ALTER DATABASE 语句

Pet*_*din 13 sql-server in-memory-database sql-server-2014

我已经从这里下载了基于 AdventureWorks 的内存示例,并遵循了随附文档中描述的所有步骤。但是,当我尝试在 SQL Server Management Studio 中运行脚本时,我收到错误消息:

多语句事务中不允许使用 ALTER DATABASE 语句

错误指向第 9 行,即:

IF NOT EXISTS (SELECT * FROM sys.data_spaces WHERE type='FX')
    ALTER DATABASE CURRENT ADD FILEGROUP [AdventureWorks2012_mod] 
    CONTAINS MEMORY_OPTIMIZED_DATA
GO
Run Code Online (Sandbox Code Playgroud)

由于这是(或多或少)微软官方文档,我假设这是我做错的事情,但我无法弄清楚它是什么。

Aar*_*and 14

不,你没有做错任何事。我得到了同样的东西。我通过将示例分解为多个脚本并在其自己的查询窗口中按顺序运行脚本的每个部分来解决它,而不是作为一个大脚本。这在我的情况下有效,因为我总是在隔离的 VM 中运行这些示例(而不是在生产服务器上!)并且事务处理是不必要的,因为我是这里唯一的一个。

今天再次仔细查看脚本,没有明确定义事务处理,但也许您将脚本粘贴到已经有活动事务的查询窗口中,或者创建了一个自动添加BEGIN TRANSACTION; / COMMIT TRANSACTION;语句的新查询窗口。

我还在这篇博文中指出了其他一些潜在的问题


Ken*_*her 9

我同意@AaronBertrand 你没有做错任何事。这不是我第一次看到带有错误的 Microsoft 脚本。实际上,如果他们发布了尽可能多的脚本,我会很惊讶没有看到任何脚本。

具体来说,问题是ALTER DATABASE根本不允许在事务中使用。您可以在此处查看 BOL 参考:事务中允许的 Transact-SQL 语句

事实上,即使像这样简单的脚本也会失败并出现相同的错误。

BEGIN TRANSACTION
ALTER DATABASE AdventureWorks2012 SET READ_WRITE
COMMIT
Run Code Online (Sandbox Code Playgroud)

正如亚伦所说,删除事务处理(或至少ALTER DATABASE是事务中的语句),你应该没问题。