Del via


Sådan gør du: Forespørg ved hjælp af tidsrejser på sætningsniveau

I Microsoft Fabric låser muligheden for tidsrejser op for muligheden for at forespørge på tidligere versioner af data uden at skulle generere flere datakopier, hvilket sparer på lageromkostninger. I denne artikel beskrives det, hvordan du forespørger lagertabeller ved hjælp af tidsrejser på sætningsniveau ved hjælp af T-SQL OPTION-delsætningen og syntaksen FOR TIMESTAMP AS OF . Denne funktion findes i øjeblikket kun som prøveversion.

Lagertabeller kan forespørges op til en opbevaringsperiode på 30 kalenderdage ved hjælp af delsætningen OPTION , hvilket angiver datoformatet yyyy-MM-ddTHH:mm:ss[.fff].

Følgende eksempler kan udføres i SQL Power Query-editor, SQL Server Management Studio (SSMS), Azure Data Studio eller en hvilken som helst T-SQL-forespørgselseditor.

Bemærk

I øjeblikket er det kun UTC-tidszonen (Coordinated Universal Time), der bruges til tidsrejser.

Tidsrejser på et lagerbord

I dette eksempel kan du se, hvordan du tidsrejser på en individuel tabel på lageret.

OPTION T-SQL-delsætningen angiver tidspunktet for returnering af dataene.

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

Tidsrejser på flere lagertabeller

OPTION-delsætningen erklæres én gang pr. forespørgsel, og resultaterne af forespørgslen afspejler tilstanden af dataene på det tidsstempel, der er angivet i forespørgslen 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');

Tidsrejse i en lagret procedure

Lagrede procedurer er et sæt SQL-sætninger, der er forudkompileret og gemt, så de kan bruges gentagne gange. OPTION-delsætningen kan erklæres én gang i den lagrede procedure, og resultatsættet afspejler tilstanden for alle tabeller på det angivne tidsstempel.

Delsætningen FOR TIMESTAMP AS OF kan ikke direkte acceptere en variabel, da værdierne i denne OPTION delsætning skal være deterministiske. Du kan bruge sp_executesql til at overføre en stærkt indtastet datetime-værdi til den lagrede procedure. Dette enkle eksempel overfører en variabel og konverterer parameteren datetime til det nødvendige format med datotypografi 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

Derefter kan du kalde den lagrede procedure og overføre en variabel som en stærkt indtastet parameter. Eksempler:

--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;

Tidsrejser i en visning

Visninger repræsenterer en gemt forespørgsel, der dynamisk henter data fra en eller flere tabeller, når der sendes en forespørgsel til visningen. Option-delsætningen kan bruges til at forespørge visningerne, så resultaterne afspejler datatilstanden på det tidsstempel, der er angivet i forespørgslen.

--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 data fra tabeller i en visning kan kun forespørges om tidsrejser fra det tidspunkt, hvor visningen blev oprettet.
  • Når en visning er ændret, er tidsrejseforespørgsler kun gyldige, når den er ændret.
  • Hvis en underliggende tabel i en visning ændres uden at ændre visningen, kan tidsrejseforespørgsler i visningen returnere dataene, før tabellen ændres, som forventet.
  • Når den underliggende tabel i en visning slippes og genoprettes uden at ændre visningen, er data for tidsrejseforespørgsler kun tilgængelige fra det tidspunkt, hvor tabellen blev genoprettet.

Begrænsninger

Du kan få flere oplysninger om tidsrejser på begrænsningerne på erklæringsniveau med FOR TIMESTAMP AS OFunder Begrænsninger for tidsrejser.