Del via


Slik gjør du det: Spørring ved hjelp av tidsreiser på setningsnivå

I Microsoft Fabric låser muligheten for tidsreiser opp muligheten til å spørre i tidligere versjoner av data uten å måtte generere flere datakopier, noe som sparer lagringskostnader. Denne artikkelen beskriver hvordan du spør etter lagertabeller ved hjelp av tidsreiser på setningsnivå, ved hjelp av T-SQL OPTION-setningsdelen og SYNtaksen FOR TIMESTAMP AS OF . Denne funksjonen er en forhåndsvisningsfunksjon.

Lagertabeller kan spørres opp til en oppbevaringsperiode på tretti kalenderdager ved hjelp av setningsdelen OPTION , som gir datoformatet yyyy-MM-ddTHH:mm:ss[.fff].

Eksemplene nedenfor kan kjøres i SQL Power Query-redigering, SQL Server Management Studio (SSMS),Azure Data Studio eller et hvilket som helst redigeringsprogram for T-SQL-spørringer.

Merk

Foreløpig brukes bare tidssonen Coordinated Universal Time (UTC) for tidsreiser.

Tidsreiser i en lagertabell

Dette eksemplet viser hvordan du tidsreiser på en individuell tabell i lageret.

OPTION T-SQL-setningen angir punkt-i-tiden for å returnere dataene.

/* Time travel using a SELECT statement */
SELECT *
FROM [dbo].[dimension_customer]
OPTION (FOR TIMESTAMP AS OF '2024-05-02T20:44:13.700');

Tidsreiser på flere lagertabeller

OPTION-setningsdelen deklareres én gang per spørring, og resultatene av spørringen gjenspeiler tilstanden til dataene ved tidsstempelet som er angitt i spørringen for alle tabeller.

SELECT Sales.StockItemKey, 
Sales.Description, 
CAST (Sales.Quantity AS int)) AS SoldQuantity, 
c.Customer
FROM [dbo].[fact_sale] AS Sales INNER JOIN [dbo].[dimension_customer] AS c
ON Sales.CustomerKey = c.CustomerKey
GROUP BY Sales.StockItemKey, Sales.Description, Sales.Quantity, c.Customer
ORDER BY Sales.StockItemKey
OPTION (FOR TIMESTAMP AS OF '2024-05-02T20:44:13.700');

Tidsreiser i en lagret prosedyre

Lagrede prosedyrer er et sett med SQL-setninger som er forhåndskompilert og lagret, slik at de kan brukes gjentatte ganger. OPTION-setningsdelen kan deklareres én gang i den lagrede prosedyren, og resultatsettet gjenspeiler tilstanden til alle tabeller ved det angitte tidsstempelet.

Setningsdelen FOR TIMESTAMP AS OF kan ikke godta en variabel direkte, da verdiene i denne OPTION setningen må være deterministiske. Du kan bruke sp_executesql til å sende en sterkt skrevet datetime-verdi til den lagrede prosedyren. Dette enkle eksemplet sender en variabel og konverterer datetime-parameteren til det nødvendige formatet med datostil 126.

CREATE PROCEDURE [dbo].[sales_by_city] (@pointInTime DATETIME)
AS
BEGIN
DECLARE @selectForTimestampStatement NVARCHAR(4000);
DECLARE @pointInTimeLiteral VARCHAR(33);

SET @pointInTimeLiteral = CONVERT(VARCHAR(33), @pointInTime, 126);
SET @selectForTimestampStatement = '
SELECT *
    FROM [dbo].[fact_sale] 
    OPTION (FOR TIMESTAMP AS OF ''' + @pointInTimeLiteral + ''')';
 
    EXEC sp_executesql @selectForTimestampStatement
END

Deretter kan du kalle den lagrede prosedyren og sende inn en variabel som en sterkt skrevet parameter. Eksempel:

--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = '2024-05-10T22:56:15.457';
EXEC dbo.sales_by_city @pointInTime;

Eller, for eksempel:

--Execute the stored procedure
DECLARE @pointInTime DATETIME;
SET @pointInTime = DATEADD(dd, -7, GETDATE())
EXEC dbo.sales_by_city @pointInTime;

Tidsreiser i en visning

Visninger representerer en lagret spørring som dynamisk henter data fra én eller flere tabeller når visningen blir spurt. OPTION-setningsdelen kan brukes til å spørre i visningene slik at resultatene gjenspeiler tilstanden til dataene i tidsstempelet som er angitt i spørringen.

--Create View
CREATE VIEW Top10CustomersView
AS
SELECT TOP (10) 
    FS.[CustomerKey], 
    DC.[Customer], 
    SUM(FS.TotalIncludingTax) AS TotalSalesAmount
FROM 
    [dbo].[dimension_customer] AS DC
INNER JOIN 
    [dbo].[fact_sale] AS FS ON DC.[CustomerKey] = FS.[CustomerKey]
GROUP BY 
    FS.[CustomerKey], 
    DC.[Customer]
ORDER BY 
    TotalSalesAmount DESC;

/*View of Top10 Customers as of a point in time*/
SELECT *
FROM [Timetravel].[dbo].[Top10CustomersView]
OPTION (FOR TIMESTAMP AS OF '2024-05-01T21:55:27.513'); 
  • De historiske dataene fra tabeller i en visning kan bare spørres om tidsreiser fra tidspunktet da visningen ble opprettet.
  • Når en visning er endret, er tidsreisespørringer bare gyldige etter at den ble endret.
  • Hvis en underliggende tabell i en visning endres uten å endre visningen, kan tidsreisespørringer i visningen returnere dataene fra før tabellen endres, som forventet.
  • Når den underliggende tabellen i en visning slippes og gjenopprettes uten å endre visningen, er data for tidsreisespørringer bare tilgjengelige fra tidspunktet etter at tabellen ble opprettet på nytt.

Begrensninger

Hvis du vil ha mer informasjon om tidsreiser på begrensningene på setningsnivå med FOR TIMESTAMP AS OF, kan du se Begrensninger for tidsreiser.