Συμπτώματα
Ας υποθέσουμε ότι χρησιμοποιείτε το Microsoft SQL Server 2016 ή 2017. Όταν επεξεργάζεστε συναλλαγές δεδομένων με βελτιστοποίηση μνήμης, χρησιμοποιώντας μεταβλητές πίνακα με βελτιστοποίηση μνήμης με την πρόταση where exists , ενδέχεται να λάβετε λάθος αποτέλεσμα.
Για παράδειγμα:
Βήμα1: Δημιουργήστε μια βάση δεδομένων και έναν πίνακα με βελτιστοποίηση μνήμης.
Δημιουργία επίδειξης ΒΆΣΕΩΝ ΔΕΔΟΜΈΝΩΝ
ALTER DATABASE επίδειξη ADD FILEGROUP demo_mod CONTAINS MEMORY_OPTIMIZED_DATA
ALTER DATABASE επίδειξη ADD FILE (name='demo_mod1', filename='C:\DATA\demo_mod1') TO FILEGROUP demo_mod
Χρήση επίδειξης
Πάει
CREATE TYPE dbo. IN_MEMORY_TABLE_TYPE AS TABLE
( source_col INT NULL,
target_col INT not NULL
INDEX ix_InMemoryTable NONCLUSTERED (target_col)
) WITH (MEMORY_OPTIMIZED = ΕΝΕΡΓΟΠΟΙΗΜΕΝΟ)
ΠΆΕΙ
Βήμα2: Εισαγωγή δεδομένων και ενημέρωση δεδομένων.
DECLARE @t dbo. IN_MEMORY_TABLE_TYPE
INSERT @t ( source_col, target_col ) VALUES (10, 0);(0; 0)
επιλέξτε * από @t
ΕΝΗΜΕΡΩΣΗ r1 SET target_col = -1 FROM @t r1
WHERE EXISTS (SELECT * FROM @t r2 WHERE r2.source_col > 0 )
ΕΠΙΛΟΓΉ * FROM @t
ΠΆΕΙ
Βήμα3: Έλεγχος αποτελεσμάτων.
Πραγματικά αποτελέσματα: Δεν ενημερώνονται όλες οι γραμμές της μεταβλητής πίνακα @t .
source_col | target_col
----------------------
10 | -1
0 | 0
Τα αναμενόμενα αποτελέσματα: Όλες οι γραμμές θα πρέπει να ενημερωθούν ώστε να έχουν target_col = -1.
source_col | target_col
----------------------
10 | -1
0 | -1.
Επίλυση
Αυτό το πρόβλημα έχει διορθωθεί στις ακόλουθες αθροιστικές ενημερώσεις για SQL Server:
Κάθε νέα συγκεντρωτική ενημέρωση για SQL Server περιέχει όλες τις άμεσες επιδιορθώσεις και όλες τις επιδιορθώσεις ασφαλείας που περιλαμβάνονταν στην προηγούμενη συγκεντρωτική ενημέρωση. Δείτε τις πιο πρόσφατες συγκεντρωτικές ενημερώσεις για SQL Server:
Κατάσταση
Η Microsoft έχει επιβεβαιώσει ότι πρόκειται για πρόβλημα στα προϊόντα της Microsoft που αναφέρονται στην ενότητα "Ισχύει για".
Αναφορές
Ενημερωθείτε σχετικά με την ορολογίαπου χρησιμοποιεί η Microsoft για την περιγραφή ενημερώσεων λογισμικού.