Bagikan melalui


Cara: Mengkueri menggunakan perjalanan waktu di tingkat pernyataan (pratinjau)

Di Microsoft Fabric, kemampuan untuk perjalanan waktu membuka kemampuan untuk mengkueri versi data sebelumnya tanpa perlu menghasilkan beberapa salinan data, menghemat biaya penyimpanan. Artikel ini menjelaskan cara mengkueri tabel gudang menggunakan perjalanan waktu di tingkat pernyataan, menggunakan klausa T-SQL OPTION dan sintaks FOR TIMESTAMP AS OF. Fitur ini masih dalam mode pratinjau.

Tabel gudang dapat dikueri hingga periode retensi tiga puluh hari kalender menggunakan OPTION klausul , memberikan format yyyy-MM-ddTHH:mm:ss[.fff]tanggal .

Contoh berikut dapat dijalankan di SQL Editor Kueri, SQL Server Management Studio (SSMS), Azure Data Studio, atau editor kueri T-SQL apa pun.

Catatan

Saat ini, hanya zona waktu Waktu Universal Terkoordinasi (UTC) yang digunakan untuk perjalanan waktu.

Perjalanan waktu di meja gudang

Contoh ini menunjukkan cara melakukan perjalanan waktu pada tabel individual di gudang.

Klausa T-SQL OPTION menentukan titik waktu untuk mengembalikan data.

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

Perjalanan waktu di beberapa tabel gudang

Klausul OPTION dideklarasikan sekali per kueri, dan hasil kueri akan mencerminkan status data pada tanda waktu yang ditentukan dalam kueri untuk semua 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');

Perjalanan waktu dalam prosedur tersimpan

Prosedur tersimpan adalah sekumpulan pernyataan SQL yang telah dikommpilasikan sebelumnya dan disimpan sehingga dapat digunakan berulang kali. Klausa OPTION dapat dideklarasikan sekali dalam prosedur tersimpan, dan kumpulan hasil mencerminkan status semua tabel pada tanda waktu yang ditentukan.

Klausa FOR TIMESTAMP AS OF tidak dapat langsung menerima variabel, karena nilai dalam klausul ini OPTION harus deterministik. Anda dapat menggunakan sp_executesql untuk meneruskan nilai tanggalwaktu yang ditik dengan kuat ke prosedur tersimpan. Contoh sederhana ini meneruskan variabel dan mengonversi parameter tanggalwaktu ke format yang diperlukan dengan gaya tanggal 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

Kemudian, Anda dapat memanggil prosedur tersimpan dan meneruskan variabel sebagai parameter yang sangat ditik. Contohnya:

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

Atau, misalnya:

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

Perjalanan waktu dalam tampilan

Tampilan mewakili kueri tersimpan yang secara dinamis mengambil data dari satu atau beberapa tabel setiap kali tampilan dikueri. Klausa OPTION dapat digunakan untuk mengkueri tampilan sehingga hasilnya mencerminkan status data pada tanda waktu yang ditentukan dalam kueri.

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

Namun, Anda tidak dapat mengkueri data sebelumnya dari tabel dalam tampilan sebelum tampilan dibuat.

Batasan

Untuk informasi selengkapnya tentang perjalanan waktu pada batasan tingkat pernyataan dengan FOR TIMESTAMP AS OF, lihat Batasan perjalanan waktu.