Consultar uma tabela temporal com versão do sistema FOR system_time ALL
parece omitir linhas em que os horários de início e término são iguais.
Por exemplo:
/* Create a simple system-versioned table */
CREATE TABLE [dbo].[svt_test](
[string] [VARCHAR](30) NOT NULL,
[validFrom] [DATETIME2](7) GENERATED ALWAYS AS ROW START NOT NULL,
[validTo] [DATETIME2](7) GENERATED ALWAYS AS ROW END NOT NULL,
CONSTRAINT [PK_svt_test] PRIMARY KEY CLUSTERED
(
[string] ASC
),
PERIOD FOR SYSTEM_TIME ([validFrom], [validTo])
)
WITH
(
SYSTEM_VERSIONING = ON ( HISTORY_TABLE = [dbo].[svt_test_history] )
);
/*
Insert and immediately delete a row.
May have to try multiple times to get a row with the same start and end
timestamp.
*/
INSERT INTO dbo.svt_test (string) VALUES ('string');
DELETE dbo.svt_test WHERE string = 'string';
/* 0 rows */
SELECT * FROM dbo.svt_test;
/* 1 row */
SELECT * FROM dbo.svt_test_history;
/*
0 rows.
Should be the "union of rows that belong to the current and the history table"
per https://msdn.microsoft.com/en-us/library/dn935015.aspx
*/
SELECT * FROM dbo.svt_test FOR system_time ALL;
/*
CONTAINED IN does not find the row either, even though MSDN says the
interval is defined as SysStartTime >= start_date_time AND SysEndTime <=
end_date_time
*/
DECLARE @Start DATETIME2(7);
SELECT @Start = validFrom FROM [dbo].[svt_test_history] WHERE string = 'string';
DECLARE @End DATETIME2(7);
SELECT @End = validTo FROM [dbo].[svt_test_history] WHERE string = 'string';
SELECT * FROM dbo.svt_test FOR system_time CONTAINED IN (@Start, @End);
/* Clean up */
ALTER TABLE dbo.svt_test SET (SYSTEM_VERSIONING = OFF);
DROP TABLE dbo.svt_test;
DROP TABLE dbo.svt_test_history;
Verifiquei isso em 2016 SP1 CU1 (12.0.4416) e 2016 CU3 (13.0.2186). Eu obtive o mesmo resultado com datetime2(0)
em vez de datetime2(7)
.
Alguém saberia se isso é provavelmente um bug ou por design? Alternativamente, talvez eu tenha entendido mal alguma coisa?
Não consegui reproduzir o que você vê. Provavelmente porque eu tenho um computador lento. Mas, por outro lado, parece que os desenvolvedores do SQL Server construíram isso pensando no meu computador lento e não no rápido.
Se eu envolvesse a inserção e a exclusão em uma transação, eles obteriam o mesmo carimbo de data e hora de início e término todas as vezes.
Das Tabelas Temporais
Portanto, se o carimbo de data/hora inicial e final for o mesmo, eles assumem que aconteceu na mesma transação.