Query tra databaseCross-Database Queries

In questo argomento si applica a: SìSQL ServernonDatabase SQL di AzurenonAzure SQL Data Warehouse non Parallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL ServernoAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

A partire da SQL Server 2014SQL Server 2014le tabelle ottimizzate per la memoria non supportano le transazioni tra database.Starting with SQL Server 2014SQL Server 2014, memory-optimized tables do not support cross-database transactions. Non è possibile accedere a un altro database dalla stessa transazione o dalla stessa query che accede anche a una tabella ottimizzata per la memoria.You cannot access another database from the same transaction or the same query that also accesses a memory-optimized table. Non è possibile copiare facilmente i dati da una tabella in un database a una tabella ottimizzata per la memoria in un altro database.You cannot easily copy data from a table in one database, to a memory-optimized table in another database.

Le variabili di tabella non sono transazionali.Table variables are not transactional. Pertanto, le variabili di tabella ottimizzata per la memoria possono essere utilizzate nelle query tra database e possono quindi facilitare lo spostamento di dati da un database nelle tabelle ottimizzate per la memoria a un altro.Therefore, memory-optimized table variables can be used in cross-database queries, and can thus facilitate moving data from one database into memory-optimized tables in another. È possibile utilizzare due transazioni.You can use two transactions. Nella prima transazione, inserire i dati della tabella remota nella variabile.In the first transaction, insert the data from the remote table into the variable. Nella seconda transazione, inserire i dati nella tabella ottimizzata per la memoria locale dalla variabile.In the second transaction, insert the data into the local memory-optimized table from the variable. Per altre informazioni sulle variabili di tabella ottimizzata per la memoria, vedere Tabella temporanea più rapida e variabile di tabella tramite l'ottimizzazione per la memoria.For more information on memory-optimized table variables, see Faster temp table and table variable by using memory optimization.

EsempioExample

Questo esempio illustra un metodo per trasferire i dati da un database in una tabella ottimizzata per la memoria in un database diverso.This example illustrates a method to transfer data from one database into a memory-optimized table in a different database.

  1. Creare oggetti di prova.Create Test Objects. Eseguire il seguente Transact-SQLTransact-SQL in SQL Server Management StudioSQL Server Management Studio.Execute the following Transact-SQLTransact-SQL in SQL Server Management StudioSQL Server Management Studio.

    
    USE master;
    GO
    
    SET NOCOUNT ON;
    
    -- Create simple database
    CREATE DATABASE SourceDatabase;
    ALTER DATABASE SourceDatabase SET RECOVERY SIMPLE;
    GO
    
    -- Create a table and insert a few records
    USE SourceDatabase;
    
    CREATE TABLE SourceDatabase.[dbo].[SourceTable] (
        [ID] [int] PRIMARY KEY CLUSTERED,
        [FirstName] nvarchar(8)
        );
    
    INSERT [SourceDatabase].[dbo].[SourceTable]
    VALUES (1, N'Bob'),
        (2, N'Susan');
    GO
    
    -- Create a database with a MEMORY_OPTIMIZED_DATA filegroup
    
    CREATE DATABASE DestinationDatabase
     ON  PRIMARY 
    ( NAME = N'DestinationDatabase_Data', FILENAME = N'D:\DATA\DestinationDatabase_Data.mdf',   SIZE = 8MB), 
     FILEGROUP [DestinationDatabase_mod] CONTAINS MEMORY_OPTIMIZED_DATA  DEFAULT
    ( NAME = N'DestinationDatabase_mod', FILENAME = N'D:\DATA\DestinationDatabase_mod', MAXSIZE = UNLIMITED)
     LOG ON 
    ( NAME = N'DestinationDatabase_Log', FILENAME = N'D:\LOG\DestinationDatabase_Log.ldf', SIZE = 8MB);
    
    ALTER DATABASE DestinationDatabase SET RECOVERY SIMPLE;
    GO
    
    USE DestinationDatabase;
    GO
    
    -- Create a memory-optimized table
    CREATE TABLE [dbo].[DestTable_InMem] (
        [ID] [int] PRIMARY KEY NONCLUSTERED,
        [FirstName] nvarchar(8)
        )
    WITH ( MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA );
    GO
    
  2. Provare ad eseguire query tra database.Attempt cross-database query. Eseguire il seguente Transact-SQLTransact-SQL in SQL Server Management StudioSQL Server Management Studio.Execute the following Transact-SQLTransact-SQL in SQL Server Management StudioSQL Server Management Studio.

    INSERT [DestinationDatabase].[dbo].[DestTable_InMem]
    SELECT * FROM [SourceDatabase].[dbo].[SourceTable]
    

    Dovrebbe essere visualizzato il seguente messaggio di errore:You should receive the following error message:

    Messaggio 41317, livello 16, stato 5Msg 41317, Level 16, State 5
    Una transazione utente che accede alle tabelle con le tabelle con ottimizzazione per la memoria o ai moduli compilati in modo nativo non può accedere a più database utente o modelli di database e msdb e non può accedere in scrittura al database master.A user transaction that accesses memory optimized tables or natively compiled modules cannot access more than one user database or databases model and msdb, and it cannot write to master.

  3. Creare un tipo di tabella ottimizzata per la memoria.Create a memory-optimized table type. Eseguire il seguente Transact-SQLTransact-SQL in SQL Server Management StudioSQL Server Management Studio.Execute the following Transact-SQLTransact-SQL in SQL Server Management StudioSQL Server Management Studio.

    USE DestinationDatabase;
    GO
    
    CREATE TYPE [dbo].[MemoryType]  
        AS TABLE  
        (  
        [ID] [int] PRIMARY KEY NONCLUSTERED,
        [FirstName] nvarchar(8)
        )  
        WITH  
            (MEMORY_OPTIMIZED = ON);  
    GO
    
  4. Riprovare ad eseguire query tra database.Re-attempt the cross-database query. Questa volta i dati di origine verranno prima trasferiti a una variabile di tabella ottimizzata per la memoria.This time the source data will first be transferred to a memory-optimized table variable. Quindi, i dati della variabile di tabella verranno trasferiti alla tabella ottimizzata per la memoria.Then the data from the tale variable will be transferred to the memory-optimized table.

    -- Declare table variable utilizing the newly created type - MemoryType
    DECLARE @InMem dbo.MemoryType;
    
    -- Populate table variable
    INSERT @InMem SELECT * FROM SourceDatabase.[dbo].[SourceTable];
    
    -- Populate the destination memory-optimized table
    INSERT [DestinationDatabase].[dbo].[DestTable_InMem] SELECT * FROM @InMem;
    GO 
    

Vedere ancheSee Also

Migrazione a OLTP in memoriaMigrating to In-Memory OLTP