我从这里下载了基于 AdventureWorks 的 In-memory 示例,并按照随附文档中描述的所有步骤进行操作。但是,当我尝试在 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
由于这是(或多或少)微软官方文档,我假设这是我做错了,但我无法弄清楚它是什么。
不,你没有做错任何事。我得到了同样的东西。我通过将示例分解为多个脚本并在其自己的查询窗口中顺序运行脚本的每个部分而不是作为一个大脚本来解决它。这对我来说很有效,因为我总是在一个隔离的 VM 中运行这些示例(而不是在生产服务器上!)并且事务处理是不必要的,因为我是这里唯一的一个。
今天再次仔细查看脚本,没有明确定义事务处理,但也许您将脚本粘贴到已经有活动事务的查询窗口中,或者创建了一个自动添加
BEGIN TRANSACTION; / COMMIT TRANSACTION;
语句的新查询窗口。我还在这篇博文中指出了其他几个潜在的陷阱。
我同意@AaronBertrand 你没有做错任何事。这不是我第一次看到带有错误的 Microsoft 脚本。实际上,与他们发布的脚本一样多,我会惊讶地没有看到任何脚本。
具体来说,问题是
ALTER DATABASE
根本不允许在事务中。您可以在此处查看 BOL 参考:Transact-SQL Statements Allowed in Transactions事实上,即使像这样简单的脚本也会失败并出现相同的错误。
正如 Aaron 所说,删除事务处理(或至少
ALTER DATABASE
从事务中删除语句),你应该没问题。使用“Go”分隔事务。这将解决问题。(它比一个一个运行容易。)也可以改变隔离级别(未测试)