Symptômes
Supposons que vous utilisez Microsoft SQL Server 2016 ou 2017. Lorsque vous traitez des transactions de données optimisées en mémoire à l’aide de variables de table à mémoire optimisée avec l’instruction where exists , vous pouvez obtenir un résultat incorrect.
Par exemple :
Étape 1 : Créer une base de données et une table mémoire optimisées.
Créer une démonstration DATABASE
DÉMONSTRATION ALTER DATABASE ADD FILEGROUP demo_mod CONTAINS MEMORY_OPTIMIZED_DATA
DÉMONSTRATION ALTER DATABASE ADD FILE (name='demo_mod1', filename='C:\DATA\demo_mod1') TO FILEGROUP demo_mod
Utiliser la démonstration
Aller
CREATE TYPE dbo. IN_MEMORY_TABLE_TYPE AS TABLE
( source_col INT NULL,
target_col INT non NULL
INDEX ix_InMemoryTable NON-CLUSTER (target_col)
) WITH (MEMORY_OPTIMIZED = ON)
ALLER
Étape 2 : Insérer des données et mettre à jour les données.
DECLARE @t dbo. IN_MEMORY_TABLE_TYPE
INSERT @t ( source_col, target_col ) VALUES (10, 0),(0, 0)
select * from @t
UPDATE r1 SET target_col = -1 FROM @t r1
WHERE EXISTS ( SELECT * FROM @t r2 WHERE r2.source_col > 0 )
SELECT * FROM @t
ALLER
Étape 3 : vérifier les résultats.
Résultats réels : toutes les lignes de variable de table @t ne sont pas mises à jour.
source_col | target_col
----------------------
10 | -1
0 | 0
Résultats attendus : Toutes les lignes doivent être mises à jour pour avoir target_col = -1.
source_col | target_col
----------------------
10 | -1
0 | -1.
Résolution
Ce problème est résolu dans les mises à jour cumulatives suivantes pour SQL Server :
Chaque nouvelle mise à jour cumulative pour SQL Server contient tous les correctifs logiciels et tous les correctifs de sécurité inclus dans la mise à jour cumulative précédente. Consultez les dernières mises à jour cumulatives pour SQL Server :
État
Microsoft a confirmé l'existence de ce problème dans les produits Microsoft figurant dans la liste des produits concernés par cet article.
Références
Découvrez la terminologieutilisée par Microsoft pour décrire les mises à jour logicielles.