KB4039776 - FIX: comportamento non corretto quando si usano tabelle ottimizzate per la memoria con l'istruzione "where exists" in SQL Server 2016 o 2017

Si applica a
SQL Server 2016 Service Pack 1 SQL Server 2016 Enterprise Core - duplicate (do not use) SQL Server 2016 Enterprise - duplicate (do not use) SQL Server 2016 Developer - duplicate (do not use) SQL Server 2016 Standard - duplicate (do not use) SQL Server 2017 on Windows (all editions)

Sintomi

Si supponga di usare Microsoft SQL Server 2016 o 2017. Quando si elaborano transazioni di dati ottimizzate per la memoria usando variabili di tabella ottimizzate per la memoria con l'istruzione where exists , è possibile ottenere un risultato errato.

Ad esempio:

Passaggio 1: Creare un database e una tabella ottimizzati per la memoria.

Crea demo di DATABASE

DEMO DI ALTER DATABASE ADD FILEGROUP demo_mod CONTIENE MEMORY_OPTIMIZED_DATA

ALTER DATABASE demo ADD FILE (name='demo_mod1', filename='C:\DATA\demo_mod1') TO FILEGROUP demo_mod

Usa demo

Vai

CREATE TYPE dbo. IN_MEMORY_TABLE_TYPE COME TABELLA

( source_col INT NULL,

target_col INT not NULL

INDICE ix_InMemoryTable NON CLUSTER (target_col)

) CON (MEMORY_OPTIMIZED = ON)

VAI

Passaggio 2: Inserire i dati e aggiornare i dati.

DECLARE @t dbo. IN_MEMORY_TABLE_TYPE

INSERIRE @t ( source_col, target_col ) VALORI (10, 0),(0, 0)

*seleziona * da @t*

AGGIORNAMENTO R1 SET target_col = -1 DA @t R1

WHERE EXISTS ( SELECT * FROM @t r2 WHERE r2.source_col > 0 )

*SELEZIONA * DA @t*

VAI

Passaggio 3: controlla i risultati.

Risultati effettivi: Non tutte le righe della variabile di tabella @t aggiornate.

source_col | target_col


10 | -1

0 | 0

Risultati previsti: Tutte le righe dovrebbero essere aggiornate in modo da avere target_col = -1.

source_col | target_col


10 | -1

0 | -1.

Risoluzione

Questo problema è stato risolto negli aggiornamenti cumulativi seguenti per SQL Server:

Aggiornamento cumulativo 1 per SQL Server 2017

Aggiornamento cumulativo 5 per SQL Server 2016 SP1

Informazioni sugli aggiornamenti cumulativi per SQL Server:

Ogni nuovo aggiornamento cumulativo per SQL Server contiene tutte le correzioni rapide e di sicurezza incluse nell'aggiornamento cumulativo precedente. Vedere gli aggiornamenti cumulativi più recenti per SQL Server:

Aggiornamento cumulativo più recente per SQL Server 2017

Aggiornamenti cumulativi più recenti per SQL Server 2016

Stato

Microsoft ha confermato che si tratta di un problema relativo ai prodotti elencati nella sezione "Si applica a".

Riferimenti

Informazioni sulla terminologia utilizzata da Microsoft per descrivere gli aggiornamenti software.