Symptomen
Stel dat u Microsoft SQL Server 2016 of 2017 gebruikt. Wanneer u gegevenstransacties die zijn geoptimaliseerd voor geheugen verwerkt met behulp van tabelvariabelen die zijn geoptimaliseerd voor geheugen met de instructie where exists , krijgt u mogelijk een verkeerd resultaat.
Bijvoorbeeld:
Stap 1: maak een voor geheugen geoptimaliseerde database en tabel.
Database-demo maken
ALTER DATABASE demo ADD FILEGROUP demo_mod CONTAINS MEMORY_OPTIMIZED_DATA
ALTER DATABASE demo ADD FILE (name='demo_mod1', bestandsnaam='C:\DATA\demo_mod1') TO FILEGROUP demo_mod
Demo gebruiken
Gaan
CREATE TYPE dbo. IN_MEMORY_TABLE_TYPE AS-TABEL
( source_col INT NULL,
target_col INT niet NULL
INDEX ix_InMemoryTable NONCLUSTERED (target_col)
) WITH (MEMORY_OPTIMIZED = AAN)
GAAN
Stap 2: Gegevens invoegen en gegevens bijwerken.
DECLAREER @t dbo. IN_MEMORY_TABLE_TYPE
INSERT @t ( source_col, target_col ) VALUES (10, 0),(0, 0)
selecteer * in @t
UPDATE r1 SET target_col = -1 FROM @t r1
WHERE EXISTS ( SELECT * FROM @t r2 WHERE r2.source_col > 0 )
SELECT * FROM @t
GAAN
Stap 3: Controleer de resultaten.
Werkelijke resultaten: niet alle rijen met tabelvariabele @t worden bijgewerkt.
source_col | target_col
----------------------
10 | -1
0 | 0
De verwachte resultaten: alle rijen moeten worden bijgewerkt met target_col = -1.
source_col | target_col
----------------------
10 | -1
0 | -1.
Oplossing
Dit probleem is opgelost in de volgende cumulatieve updates voor SQL Server:
Elke nieuwe cumulatieve update voor SQL Server bevat alle hotfixes en alle beveiligingspatches die zijn opgenomen in de vorige cumulatieve update. Bekijk de meest recente cumulatieve updates voor SQL Server:
Status
Microsoft heeft bevestigd dat dit probleem zich kan voordoen in de Microsoft-producten die worden vermeld in de sectie Van toepassing op.
Verwijzingen
Meer informatie over de terminologiedie Microsoft gebruikt om software-updates te beschrijven.