Symptomer
Antag, at du bruger Microsoft SQL Server 2016 eller 2017. Når du behandler hukommelsesoptimerede datatransaktioner ved hjælp af hukommelsesoptimerede tabelvariabler med sætningen where exists , kan du få et forkert resultat.
For eksempel:
Trin1: Opret en hukommelsesoptimeret database og tabel.
Demo af Opret DATABASE
ALTER DATABASE demo ADD FILEGROUP demo_mod CONTAINS MEMORY_OPTIMIZED_DATA
ALTER DATABASE demo ADD FILE (name='demo_mod1', filename='C:\DATA\demo_mod1') TO FILEGROUP demo_mod
Brug demo
Gå
OPRET TYPE dbo. IN_MEMORY_TABLE_TYPE SOM TABEL
( source_col INT NULL,
target_col INT not NULL
INDEX ix_InMemoryTable NONCLUSTERED (target_col)
) MED (MEMORY_OPTIMIZED = TIL)
GO
Trin2: Indsæt data, og opdater data.
ERKLÆRER @t dbo. IN_MEMORY_TABLE_TYPE
INDSÆT @t ( source_col, target_col ) VÆRDIER (10, 0),(0, 0)
vælg * fra @t
UPDATE r1 SET target_col = -1 FROM @t r1
WHERE EXISTS ( SELECT * FROM @t r2 WHERE r2.source_col > 0 )
SELECT * FROM @t
GO
Trin3: Kontrollér resultaterne.
Faktiske resultater: Ikke alle rækker med tabelvariable @t blive opdateret.
source_col | target_col
----------------------
10 | -1
0 | 0
De forventede resultater: Alle rækker skal opdateres, så de har target_col = -1.
source_col | target_col
----------------------
10 | -1
0 | -1.
Løsning
Dette problem er rettet i følgende kumulative opdateringer til SQL Server:
Hver ny samlet opdatering til SQL Server indeholder alle de hotfixes og alle de sikkerhedsrettelser, der var inkluderet i den tidligere akkumulerede opdatering. Se de seneste kumulative opdateringer til SQL Server:
Status
Microsoft har bekræftet, at problemet findes i de Microsoft-produkter, der er angivet i afsnittet "Gælder for".
Referencer
Få mere at vide om den terminologi, som Microsoft bruger til at beskrive softwareopdateringer.