複数データベースにまたがるクエリCross-Database Queries

適用対象: ○SQL Server XAzure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

SQL Server 2014 (12.x)SQL Server 2014 (12.x)以降、メモリ最適化テーブルで複数データベースにまたがるトランザクションはサポートされません。Starting with SQL Server 2014 (12.x)SQL Server 2014 (12.x), memory-optimized tables do not support cross-database transactions. メモリ最適化テーブルにもアクセスする同じトランザクションまたは同じクエリから別のデータベースにアクセスすることはできません。You cannot access another database from the same transaction or the same query that also accesses a memory-optimized table. あるデータベースのテーブルから別のデータベースのメモリ最適化テーブルに、データを簡単にコピーすることはできません。You cannot easily copy data from a table in one database, to a memory-optimized table in another database.

テーブル変数はトランザクション処理されません。Table variables are not transactional. そのため、メモリ最適化テーブル変数を複数データベースにまたがるクエリで使用して、あるデータベースのデータを別のデータベースのメモリ最適化テーブルに簡単に移動できるようにすることができます。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. 2 つのトランザクションを使用できます。You can use two transactions. 最初のトランザクションで、リモート テーブルから変数にデータを挿入します。In the first transaction, insert the data from the remote table into the variable. 2 つ目のトランザクションで、ローカルなメモリ最適化テーブルに変数からデータを挿入します。In the second transaction, insert the data into the local memory-optimized table from the variable. メモリ最適化テーブルの変数の詳細については、「 Faster temp table and table variable by using memory optimization」 (メモリ最適化を使用した一時テーブルとテーブル変数の高速化) を参照してください。For more information on memory-optimized table variables, see Faster temp table and table variable by using memory optimization.

Example

この例は、あるデータベースから別のデータベースにあるメモリ最適化テーブルにデータを転送する方法を示しています。This example illustrates a method to transfer data from one database into a memory-optimized table in a different database.

  1. テスト オブジェクトを作成します。Create Test Objects. Transact-SQLTransact-SQL で次の 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. 複数のデータベースにまたがるクエリを試行します。Attempt cross-database query. Transact-SQLTransact-SQL で次の 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]
    

    次のエラー メッセージが表示されます。You should receive the following error message:

    メッセージ 41317、レベル 16、状態 5Msg 41317, Level 16, State 5
    メモリ最適化テーブルまたはネイティブ コンパイル モジュールにアクセスするユーザー トランザクションは、複数のユーザー データベース、model データベース、および msdb データベースにはアクセスできません。また、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. メモリ最適化テーブル型を作成します。Create a memory-optimized table type. Transact-SQLTransact-SQL で次の 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. 複数のデータベースにまたがるクエリを再試行します。Re-attempt the cross-database query. 今度は、ソース データが最初にメモリ最適化テーブルの変数に転送されます。This time the source data will first be transferred to a memory-optimized table variable. 次にテーブルの変数からメモリ最適化テーブルにデータが転送されます。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 
    

参照See Also

インメモリ OLTP への移行Migrating to In-Memory OLTP