Trabalhar com tabelas temporais na versão do sistema e com otimização de memória

Aplica-se a: SQL Server 2016 (13.x) e versões posteriores da Instância Gerenciada de SQL do Azure

Este artigo descreve como trabalhar com uma tabela temporal versionada pelo sistema otimizada para memória difere de trabalhar com uma tabela temporal versionada pelo sistema baseada em disco.

Note

As tabelas temporais com otimização de memória só estão disponíveis no SQL Server e na Instância Gerenciada de SQL do Azure. Tabelas com otimização de memória e tabelas temporais estão disponíveis independentemente no Banco de Dados SQL do Azure.

Descobrir metadados

Para descobrir metadados sobre uma tabela temporal versionada pelo sistema otimizada para memória, combine informações de sys.tables e sys.internal_tables. Uma tabela temporal versionada pelo sistema aparece como a coluna parent_object_id da tabela de histórico interna na memória.

Este exemplo mostra como consultar e unir essas tabelas.

SELECT SCHEMA_NAME(T1.schema_id) AS TemporalTableSchema,
       OBJECT_NAME(IT.parent_object_id) AS TemporalTableName,
       T1.object_id AS TemporalTableObjectId,
       IT.Name AS InternalHistoryStagingName,
       SCHEMA_NAME(T2.schema_id) AS HistoryTableSchema,
       OBJECT_NAME(T1.history_table_id) AS HistoryTableName
FROM sys.internal_tables AS IT
     INNER JOIN sys.tables AS T1
         ON IT.parent_object_id = T1.object_id
     INNER JOIN sys.tables AS T2
         ON T1.history_table_id = T2.object_id
WHERE T1.is_memory_optimized = 1
      AND T1.temporal_type = 2;

Modificar dados

Você pode modificar tabelas temporais otimizadas para memória por meio de procedimentos armazenados compilados nativamente. Esses procedimentos permitem converter tabelas otimizadas para memória não temporal e manter procedimentos nativamente armazenados existentes.

Este exemplo mostra como modificar uma tabela existente em um módulo compilado nativamente.

CREATE PROCEDURE dbo.UpdateFXCurrencyPair (
    @ProviderID INT,
    @CurrencyID1 INT,
    @CurrencyID2 INT,
    @BidRate DECIMAL (8, 4),
    @AskRate DECIMAL (8, 4)
)
WITH NATIVE_COMPILATION,
     SCHEMABINDING,
     EXECUTE AS OWNER
AS
BEGIN ATOMIC
WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English')
    UPDATE dbo.FXCurrencyPairs
        SET AskRate = @AskRate,
            BidRate = @BidRate
    WHERE ProviderID = @ProviderID
          AND CurrencyID1 = @CurrencyID1
          AND CurrencyID2 = @CurrencyID2;
END;