Tabela Temporal no SQL Server – Parte 2: Consultando Dados Históricos


Na Parte 1, vimos como criar uma tabela temporal e entendemos seu funcionamento interno. Agora chegou a hora de aprender a explorar todo o potencial desse recurso: consultar o histórico de alterações dos dados.
Se você quer saber como uma linha estava ontem, quando uma informação foi modificada ou quais valores foram registrados em determinado intervalo de tempo, essa parte é para você!
🔎 Sintaxe: FOR SYSTEM_TIME
Com a cláusula FOR SYSTEM_TIME
, é possível fazer consultas temporais de forma intuitiva. A cláusula pode ser usada com diferentes operadores:
✅ Tipos de consultas possíveis:
Cláusula | Descrição |
AS OF | Estado exato em um ponto no tempo |
FROM ... TO | Registros válidos no intervalo |
BETWEEN ... AND | Mesma ideia, com intervalo fechado |
CONTAINED I``N | Linhas completamente contidas no período |
ALL | Todas as versões (atuais + histórico) |
📘 Exemplos Práticos
Vamos utilizar a tebal criada pa 1a parte, segue script abaixo:
CREATE TABLE dbo.Cliente (
Cliente_ID int not null primary key,
Nome varchar(50) not null,
RendaMensal decimal(10,2) null,
RendaAnual as RendaMensal * 12,
SysStartTime datetime2 GENERATED ALWAYS AS ROW START HIDDEN,
SysEndTime datetime2 GENERATED ALWAYS AS ROW END HIDDEN,
PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime))
WITH(SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Cliente_Hist))
INSERT dbo.Cliente (Cliente_ID,Nome,RendaMensal)
VALUES
(1,'Paulo',10000.00),
(2,'Ana',20000.00),
(3,'Katia',30000.00)
Agora vamos executar algumas alterações:
UPDATE dbo.Cliente SET RendaMensal = 30100.00 WHERE Cliente_ID = 3
WAITFOR DELAY '00:01.000'
DELETE dbo.Cliente WHERE Cliente_ID = 2
UPDATE dbo.Cliente SET RendaMensal = 30200.00 WHERE Cliente_ID = 3
WAITFOR DELAY '00:01.000'
UPDATE dbo.Cliente SET RendaMensal = 30300.00 WHERE Cliente_ID = 3
SELECT Cliente_ID, Nome, RendaMensal, RendaAnual, SysStartTime, SysEndTime
FROM dbo.Cliente
FOR SYSTEM_TIME ALL
ORDER BY Cliente_ID, SysStartTime
O Script acima mostra todo o conteúdo da tabela Cliente incluindo todo o histórico de atualizações. Reparem as 3 atualizações na coluna RendaMensal do cliente Katia, vamos utilizar abaixo FOR SYSTEM_TIME AS OF para selecionar uma atualização do cliente Katia:
SELECT * FROM dbo.Cliente
FOR SYSTEM_TIME AS OF '2016-09-02 22:50:09.9381378'
WHERE Cliente_ID = 3
No próximo script deixa clara a diferença entre FOR SYSTEM_TIME FROM e FOR SYSTEM_TIME BETWEEN:
SELECT Cliente_ID, Nome, RendaMensal, RendaAnual, SysStartTime, SysEndTime
FROM dbo.Cliente
FOR SYSTEM_TIME FROM '2016-09-02 22:49:48.6712690' TO '2016-09-02 22:51:09.9746530'
WHERE Cliente_ID = 3
SELECT Cliente_ID, Nome, RendaMensal, RendaAnual, SysStartTime, SysEndTime
FROM dbo.Cliente
FOR SYSTEM_TIME BETWEEN '2016-09-02 22:49:48.6712690' AND '2016-09-02 22:51:09.9746530'
WHERE Cliente_ID = 3
O resultado do FOR SYSTEM_TIME FROM não incluiu a 3ª alteração porque os parâmetros inicial e final não são incluídos no resultado, já no FOR SYSTEM_TIME BETWEEN inclui ambos os parâmetros no resultado.
Já a cláusula FOR SYSTEM_TIME CONTAINED seleciona os registros a partir de uma lista de datas, exemplo no script abaixo:
SELECT Cliente_ID, Nome, RendaMensal, RendaAnual, SysStartTime, SysEndTime
FROM dbo.Cliente
FOR SYSTEM_TIME CONTAINED IN ('2016-09-02 22:49:48.6712690','2016-09-02 22:51:09.9746530')
WHERE Cliente_ID = 3
📌 Dica Importante
As colunas SysStartTime
e SysEndTime
são gerenciadas automaticamente pelo SQL Server, mas podem ser exibidas para consultas históricas. Essas colunas indicam a validade temporal de cada versão de linha.
💡 Casos de uso no mundo real
Auditoria de alterações em dados críticos (como cadastro de clientes)
Identificação de alterações indevidas
Comparação entre versões de registros
Reconstrução do estado de uma tabela para uma data passada
Com FOR SYSTEM_TIME
, o SQL Server oferece uma solução de auditoria nativa, performática e confiável — sem precisar de triggers ou desenvolvimento adicional.
Na próxima parte da série, vamos explorar boas práticas, limitações e dicas avançadas para usar Temporal Tables com eficiência em ambientes reais.
Fui, mas volto com mais SQL Server em breve!
✍️ Sobre o autor
O Prof. Landry é especialista em Microsoft SQL Server desde 1999, Microsoft Trainer, Professor Universitário e criador do canal SQL Server Expert no YouTube, com conteúdo técnico semanal para DBAs e profissionais de dados.
🚀 Quer aprender mais sobre SQL Server?
👉 Me acompanhe no LinkedIn e inscreva-se no canal para não perder nenhuma dica prática!
Subscribe to my newsletter
Read articles from SQL Server Expert directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

SQL Server Expert
SQL Server Expert
O Prof. Landry Duailibe é especialista em Microsoft SQL Server desde 1999, Microsoft Certified Trainer, professor universitário e criador do canal SQL Server Expert no YouTube, onde compartilha conteúdo técnico semanal para DBAs e profissionais de dados. Já ajudou milhares de alunos a evoluírem suas habilidades com SQL Server e conquistarem melhores oportunidades na área de dados.