Problembeschreibung
Angenommen, Sie verwenden Microsoft SQL Server 2016 oder 2017. Wenn Sie speicheroptimierte Datentransaktionen mithilfe speicheroptimierter Tabellenvariablen mit der where exists-Anweisung verarbeiten, erhalten Sie möglicherweise ein falsches Ergebnis.
Beispiel:
Schritt 1: Erstellen sie eine speicheroptimierte Datenbank und Tabelle.
Demo zum Erstellen einer DATENBANK
ALTER DATABASE-Demo HINZUFÜGEN VON FILEGROUP demo_mod CONTAINS MEMORY_OPTIMIZED_DATA
ALTER DATABASE demo ADD FILE (name='demo_mod1', filename='C:\DATA\demo_mod1') TO FILEGROUP demo_mod
Demo verwenden
Gehen
CREATE TYPE dbo. IN_MEMORY_TABLE_TYPE AS TABLE
( source_col INT NULL,
target_col INT nicht NULL
INDEX ix_InMemoryTable NONCLUSTERED (target_col)
) WITH (MEMORY_OPTIMIZED = ON)
GEHEN
Schritt 2: Einfügen von Daten und Aktualisieren von Daten.
DECLARE @t dbo. IN_MEMORY_TABLE_TYPE
INSERT @t ( source_col, target_col ) VALUES (10, 0),(0, 0)
Wählen Sie * aus @t
UPDATE r1 SET target_col = -1 FROM @t r1
WHERE EXISTS ( SELECT * FROM @t r2 WHERE r2.source_col > 0 )
SELECT * FROM @t
GEHEN
Schritt 3: Überprüfen Sie die Ergebnisse.
Tatsächliche Ergebnisse: Nicht alle Zeilen der Tabellenvariablen @t aktualisiert werden.
source_col | target_col
----------------------
10 | -1
0 | 0
Die erwarteten Ergebnisse: Alle Zeilen sollten aktualisiert werden, um target_col = -1 zu erhalten.
source_col | target_col
----------------------
10 | -1
0 | -1.
Lösung
Dieses Problem wurde in den folgenden kumulativen Updates für SQL Server behoben:
Jedes neue kumulative Update für SQL Server enthält alle Hotfixes und alle Sicherheitsfixes, die im vorherigen kumulativen Update enthalten waren. Sehen Sie sich die neuesten kumulativen Updates für SQL Server an:
Status
Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel genannten Microsoft-Produkten handelt.
Informationsquellen
Erfahren Sie mehr über die Terminologie, die Microsoft zum Beschreiben von Softwareupdates verwendet.