Sintomi
Si supponga di usare Microsoft SQL Server 2016 o 2017. Quando si elaborano transazioni dati ottimizzate per la memoria usando le variabili di tabella ottimizzate per la memoria con l'istruzione WHERE EXISTS , è possibile che venga restituito un risultato errato.
Ad esempio:
Step1: creare un database e una tabella ottimizzati per la memoria.
Creare una demo di DATABASE
ALTER DATABASE demo ADD FILEgroup demo_mod contiene MEMORY_OPTIMIZED_DATA
ALTER DATABASE demo ADD FILE (Name =' demo_mod1', filename =' C:\DATA\ demo_mod1') in filegroup demo_mod
Usare la versione demo
Andare
Crea tipo dbo. IN_MEMORY_TABLE_TYPE COME TABELLA
(source_col INT NULL,
target_col INT NOT NULL
INDEX ix_InMemoryTable NONCLUSTERED (target_col)
) WITH (MEMORY_OPTIMIZED = ATTIVATA)
ANDARE
Fase 2: inserire dati e aggiornare i dati.
DICHIARA @t dbo. IN_MEMORY_TABLE_TYPE
INSERIRE i valori @t (source_col, target_col) (10; 0), (0, 0)
Selezionare * da @t
UPDATE R1 SET target_col =-1 da @t R1
DOVE esiste (selezionare * da @t R2 in cui r2.source_col > 0)
Selezionare * da @t
ANDARE
Step3: verificare i risultati.
Risultati effettivi: non tutte le righe della variabile di tabella @t vengono aggiornate.
source_col | target_col
----------------------
10 | -1
0 | 0
Risultati previsti: tutte le righe devono essere aggiornate per avere target_col =-1.
source_col | target_col
----------------------
10 | -1
0 | -1.
Risoluzione
Questo problema è stato risolto negli aggiornamenti cumulativi seguenti per SQL Server:
Ogni nuovo aggiornamento cumulativo per SQL Server contiene tutti gli hotfix e tutti gli aggiornamenti della sicurezza inclusi nell'aggiornamento cumulativo precedente. Vedere gli ultimi aggiornamenti cumulativi per SQL Server:
Stato
Microsoft ha confermato che questo problema si verifica nei prodotti elencati nella sezione "Si applica a".
Riferimenti
Informazioni sulla terminologiautilizzata da Microsoft per descrivere gli aggiornamenti software.