Sintomas
Suponha que está a utilizar o Microsoft SQL Server 2016 ou 2017. Quando processa transações de dados otimizadas para memória através de variáveis de tabela otimizadas para memória com a instrução onde existe , poderá obter um resultado errado.
Por exemplo:
Passo 1: criar uma base de dados e uma tabela otimizadas para memória.
Criar demonstração da 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
Utilizar Demonstração
Ir
CREATE TYPE dbo. IN_MEMORY_TABLE_TYPE COMO TABELA
( source_col INT NULL,
target_col INT não NULL
INDEX IX_INMEMORYTABLE NONCLUSTERED (target_col)
) COM (MEMORY_OPTIMIZED = ATIVADO)
GO
Passo 2: inserir dados e atualizar dados.
DECLARE @t dbo. IN_MEMORY_TABLE_TYPE
INSERIR @t ( source_col, target_col ) VALORES (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
GO
Passo 3: verificar os resultados.
Resultados Reais: nem todas as linhas da variável de tabela @t são atualizadas.
source_col | target_col
----------------------
10 | -1
0 | 0
Os resultados esperados: todas as linhas devem ser atualizadas para terem target_col = -1.
source_col | target_col
----------------------
10 | -1
0 | -1.
Resolução
Este problema foi corrigido nas seguintes atualizações cumulativas para SQL Server:
Cada nova atualização cumulativa para SQL Server contém todas as correções e todas as correções de segurança incluídas na atualização cumulativa anterior. Consulte as atualizações cumulativas mais recentes para SQL Server:
Estado
A Microsoft confirmou que este problema ocorre nos produtos da Microsoft listados na secção "Aplica-se a".
Referências
Saiba mais sobre a terminologiaque a Microsoft utiliza para descrever as atualizações de software.