Udostępnij przez


Instrukcje: wykonywanie zapytań przy użyciu podróży w czasie na poziomie instrukcji

W usłudze Microsoft Fabric możliwość podróżowania w czasie umożliwia wykonywanie zapytań dotyczących poprzednich wersji danych bez konieczności generowania wielu kopii danych, co pozwala zaoszczędzić na kosztach magazynowania. W tym artykule opisano sposób wykonywania zapytań dotyczących tabel magazynu przy użyciu podróży w czasie na poziomie instrukcji, przy użyciu klauzuli T-SQL OPTION i składni TIMESTAMP AS OF.

Tabele magazynu mogą być odpytywane do okresu przechowywania 30 dni kalendarzowych przy użyciu OPTION klauzuli , podając format yyyy-MM-ddTHH:mm:ss[.fff]daty .

Poniższe przykłady można wykonać w edytorze zapytań SQL, programie SQL Server Management Studio (SSMS),rozszerzeniu mssql z programem Visual Studio Code lub dowolnym edytorze zapytań języka T-SQL.

Uwaga

Obecnie tylko strefa czasowa koordynowanego czasu uniwersalnego (UTC) jest używana do podróży w czasie.

Podróż w czasie w tabeli magazynu

W tym przykładzie pokazano, jak podróżować w poszczególnych tabelach w magazynie.

Klauzula T-SQL OPTION określa punkt w czasie, aby zwrócić dane.

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

Podróż w czasie w wielu tabelach magazynu

Klauzula OPTION jest zadeklarowana raz na zapytanie, a wyniki zapytania będą odzwierciedlać stan danych w znaczniku czasu określonym w zapytaniu dla wszystkich tabel.

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

Podróż w czasie w procedurze składowanej

Procedury składowane to zestaw instrukcji SQL, które są wstępnie skompilowane i przechowywane, aby można było ich używać wielokrotnie. Klauzulę OPTION można zadeklarować raz w procedurze składowanej, a zestaw wyników odzwierciedla stan wszystkich tabel w określonym znaczniku czasu.

Klauzula FOR TIMESTAMP AS OF nie może bezpośrednio zaakceptować zmiennej, ponieważ wartości w tej OPTION klauzuli muszą być deterministyczne. Możesz użyć sp_executesql, aby przekazać silnie typizowaną wartość daty/godziny do procedury składowanej. Ten prosty przykład przekazuje zmienną i konwertuje parametr datetime na wymagany format z stylem daty 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

Następnie można wywołać procedurę składowaną i przekazać zmienną jako silnie typizowanego parametru. Na przykład:

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

Lub, na przykład:

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

Podróż w czasie w widoku

Widoki reprezentują zapisane zapytanie, które dynamicznie pobiera dane z co najmniej jednej tabeli przy każdym zapytaniu względem widoku. Klauzula OPTION może służyć do wykonywania zapytań względem widoków, aby wyniki odzwierciedlały stan danych w znaczniku czasu określonym w zapytaniu.

--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'); 
  • Dane historyczne z tabel w widoku mogą być odpytywane tylko pod kątem podróży w czasie rozpoczynającym się od momentu utworzenia widoku.
  • Po zmianie widoku zapytania dotyczące podróży w czasie są prawidłowe tylko po jego zmianie.
  • Jeśli tabela bazowa widoku zostanie zmieniona bez zmiany widoku, zapytania dotyczące podróży w czasie w widoku mogą zwracać dane z przed zmianą tabeli zgodnie z oczekiwaniami.
  • Gdy podstawowa tabela widoku zostanie porzucona i utworzona ponownie bez modyfikowania widoku, dane dla zapytań dotyczących podróży czasowych są dostępne tylko od momentu ponownego utworzenia tabeli.

Podróż czasowa dla operacji DML

Język manipulowania danymi (DML) służy do wstawiania, tworzenia i wypełniania tabel przez manipulowanie i przekształcanie istniejących danych. Klauzula OPTION i OPTION (FOR TIMESTAMP AS OF ... może być używana wraz z operacjami DML, takimi jak INSERT INTO ... SELECT, CREATE TABLE AS SELECT (CTAS) i SELECT INTO.

/*Time travel for INSERT INTO...SELECT*/
INSERT INTO dbo.Fact_Sale_History 
(SalesKey, StockItemKey, Quantity, Description, UnitPrice, InvoiceDateKey)
SELECT 
    SaleKey AS SalesKey,
    StockItemKey,
    Quantity,
    Description,
    UnitPrice,
    InvoiceDateKey
FROM dbo.[Fact_Sale]
OPTION (FOR TIMESTAMP AS OF '2025-06-18T19:55:13.853');
/*Time travel for CREATE TABLE AS SELECT*/
CREATE TABLE dbo.SalesHistory AS 
SELECT * FROM dbo.fact_sale 
OPTION (FOR TIMESTAMP AS OF '2025-06-18T19:55:13.853');
/*Time travel for SELECT INTO*/
SELECT * INTO dbo.SalesHistory1 
FROM dbo.fact_sale 
OPTION (FOR TIMESTAMP AS OF '2025-06-18T19:55:13.853');

Ograniczenia

Aby uzyskać więcej informacji na temat podróży w czasie na poziomie instrukcji FOR TIMESTAMP AS OFw przypadku , zobacz Ograniczenia podróży czasowej.