Baixei o exemplo na memória baseado em AdventureWorks aqui e segui todas as etapas descritas no documento que o acompanha. No entanto, quando tento executar o script no SQL Server Management Studio, recebo a mensagem de erro:
Instrução ALTER DATABASE não permitida na transação de várias instruções
O erro aponta para a linha 9, que é:
IF NOT EXISTS (SELECT * FROM sys.data_spaces WHERE type='FX')
ALTER DATABASE CURRENT ADD FILEGROUP [AdventureWorks2012_mod]
CONTAINS MEMORY_OPTIMIZED_DATA
GO
Como esta é (mais ou menos) documentação oficial da Microsoft, estou assumindo que é algo que estou fazendo errado, mas não consigo descobrir o que é.
Não, você não está fazendo nada de errado. Eu tenho a mesma coisa. Resolvi isso dividindo a amostra em vários scripts e executando cada seção do script sequencialmente, em sua própria janela de consulta, em vez de como um script grande. Isso funcionou no meu caso porque estou sempre executando esses exemplos em uma VM isolada (não em um servidor de produção!) e o manuseio de transações é desnecessário, pois sou o único aqui.
Observando o script novamente hoje mais de perto, não há manipulação de transação definida explicitamente, mas talvez você colou o script em uma janela de consulta que já tinha uma transação ativa ou criou uma nova janela de consulta que adicionou
BEGIN TRANSACTION; / COMMIT TRANSACTION;
instruções automaticamente.Eu também apontei algumas outras armadilhas em potencial neste post do blog .
Eu concordo com @AaronBertrand que você não está fazendo nada de errado. Esta não seria a primeira vez que vejo um script da Microsoft com um bug. Realisticamente, com tantos roteiros quanto eles publicam, eu ficaria surpreso se não visse nenhum.
Especificamente, o problema é que isso
ALTER DATABASE
não é permitido em uma transação. Você pode ver a referência BOL aqui: Instruções Transact-SQL permitidas em transaçõesNa verdade, mesmo um script simples como esse falha com o mesmo erro.
Como Aaron disse, remova o manuseio da transação (ou pelo menos a
ALTER DATABASE
declaração da transação) e você deve ficar bem.Use "Go" para separar as transações. Isso resolverá o problema. (É mais fácil do que executar um por um.) Também pode alterar o nível de isolamento (não testado)