Datenbankübergreifende Abfragen
Gilt für:SQL Server
Ab SQL Server 2014 (12.x) unterstützen speicheroptimierte Tabellen keine datenbankübergreifenden Transaktionen. Innerhalb einer Transaktion oder Abfrage, die auf eine speicheroptimierte Tabelle zugreift, können Sie nicht gleichzeitig auf eine andere Datenbank zugreifen. Daten aus einer Tabelle in einer Datenbank können nicht einfach in eine speicheroptimierte Tabelle in einer anderen Datenbank kopiert werden.
Tabellenvariablen sind nicht transaktional. Daher können speicheroptimierte Tabellenvariablen in datenbankübergreifenden Abfragen verwendet werden, um Daten aus einer Datenbank in speicheroptimierte Tabellen in einer anderen Datenbank zu verschieben. Sie können zwei Transaktionen verwenden. In der ersten Transaktion fügen Sie die Daten aus der Remotetabelle in die Variable ein. In der zweiten Transaktion fügen Sie die Daten aus der Variablen in die lokale speicheroptimierte Tabelle ein. Weitere Informationen zu speicheroptimierten Tabellenvariablen finden Sie unter Schnellere temporäre Tabellen und Tabellenvariablen durch Speicheroptimierung.
Beispiel
Dieses Beispiel zeigt eine Methode zum Übertragen von Daten aus einer Datenbank in eine speicheroptimierte Tabelle in einer anderen Datenbank.
Erstellen Sie Testobjekte. Führen Sie die folgenden Transact-SQL in SQL Server Management Studio aus.
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
Versuchen Sie eine datenbankübergreifende Abfrage. Führen Sie die folgenden Transact-SQL in SQL Server Management Studio aus.
INSERT [DestinationDatabase].[dbo].[DestTable_InMem] SELECT * FROM [SourceDatabase].[dbo].[SourceTable]
Es sollte die folgende Fehlermeldung angezeigt werden:
Meldung 41317, Ebene 16, Status 5
Eine Benutzertransaktion, über die auf speicheroptimierte Tabellen oder systemintern kompilierte Module zugegriffen wird, kann maximal auf eine Benutzerdatenbank, ein Datenbankmodell und eine msdb-Datenbank zugreifen. Schreibzugriffe auf die Masterdatenbank werden nicht unterstützt.Erstellen Sie einen speicheroptimierten Tabellentyp. Führen Sie die folgenden Transact-SQL in SQL Server Management Studio aus.
USE DestinationDatabase; GO CREATE TYPE [dbo].[MemoryType] AS TABLE ( [ID] [int] PRIMARY KEY NONCLUSTERED, [FirstName] nvarchar(8) ) WITH (MEMORY_OPTIMIZED = ON); GO
Versuchen Sie erneut die datenbankübergreifende Abfrage. Dieses Mal werden die Daten zunächst in eine speicheroptimierte Tabellenvariable übertragen. Dann werden die Daten aus der Tabellenvariablen in die speicheroptimierte Tabelle übertragen.
-- 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
Weitere Informationen
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Tickets als Feedbackmechanismus für Inhalte auslaufen lassen und es durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unter:Einreichen und Feedback anzeigen für