Sintomi
Si supponga di usare Microsoft SQL Server 2016 o 2017. Quando si elaborano transazioni dati ottimizzate per la memoria utilizzando variabili di tabella ottimizzate per la memoria con l'istruzione where exists , si potrebbe ottenere un risultato errato.
Ad esempio:
Passaggio 1: Creare una tabella e un database ottimizzati per la memoria.
Creare una demo di 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
Usare demo
Andare
CREATE TYPE dbo. IN_MEMORY_TABLE_TYPE AS TABLE
( source_col INT NULL,
target_col INT non NULL
INDICE ix_InMemoryTable NON CLUSTER (target_col)
) WITH (MEMORY_OPTIMIZED = ON)
ANDARE
Passaggio 2: Inserire dati e aggiornare i dati.
DECLARE @t dbo. IN_MEMORY_TABLE_TYPE
INSERISCI @t ( source_col, target_col ) VALORI (10, 0),(0, 0)
seleziona * da @t
UPDATE r1 SET target_col = -1 FROM @t r1
WHERE EXISTS ( SELECT * FROM @t r2 WHERE r2.source_col > 0 )
SELECT * FROM @t
ANDARE
Passaggio 3: Controllare 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 in modo che abbiano 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 aggiornamenti rapidi e tutte le correzioni per la sicurezza inclusi nell'aggiornamento cumulativo precedente. Scopri gli aggiornamenti cumulativi più recenti 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.