Sql-Server
獲取今天日期的確定性函式
我正在嘗試使用以下程式碼創建索引視圖(以便我可以將其發布以將其複制為表):
CREATE VIEW lc.vw_dates WITH SCHEMABINDING AS SELECT DATEADD(day, DATEDIFF(day, 0, GETDATE()), number) AS SettingDate FROM lc.numbers WHERE number<8 GO CREATE UNIQUE CLUSTERED INDEX idx_LCDates ON lc.vw_dates(SettingDate)
lc.numbers 只是一個包含 1 列 (
number
) 的表,它按第 1-100 行遞增。但是,我不斷收到錯誤消息:
視圖 ’lc.vw_dates’ 中的列 ‘SettingDate’ 不能用於索引或統計資訊或用作分區鍵,因為它是不確定的。
我意識到這
GETDATE()
是不確定的。但是,有沒有辦法在不繪製日曆表的情況下完成這項工作?
您不能將該函式
GETDATE()
用作持久視圖的基礎,因為該函式的輸出會隨時更改。這就是 SQL Server 在錯誤“因為它是不確定的”中的意思。每次呼叫函式結果時都必須可預測地相同,以便 SQL Server 持久化結果。幸運的是,有一種簡單的方法可以讓您使用計劃的作業每天保存一次這些數據。也許使用 SQL Server Agent 或 Windows Job Scheduler 等。
在這裡,我正在創建數字表,以及未來 7 天的表格:
CREATE TABLE dbo.Numbers ( Number INT NOT NULL CONSTRAINT PK_Numbers PRIMARY KEY CLUSTERED ); ;WITH cte AS ( SELECT TOP(100) Number = ROW_NUMBER() OVER (ORDER BY t1.num, t2.num) FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) t1(num) , (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) t2(num) ORDER BY t1.num * t2.num ) INSERT INTO dbo.Numbers (Number) SELECT cte.Number FROM cte; CREATE TABLE dbo.Next7Days ( SettingDate DATETIME NOT NULL CONSTRAINT PK_Next8Days PRIMARY KEY CLUSTERED );
安排每天發生一次:
TRUNCATE TABLE dbo.Next7Days; INSERT INTO dbo.Next7Days(SettingDate) SELECT SettingDate = DATEADD(DAY, n.Number, DATEDIFF(DAY, 0, GETDATE())) FROM dbo.Numbers n WHERE n.Number < 8;
由於接下來 7 天的日期每天僅更改一次,因此此解決方案應該可以正常工作。
dbo.Next7Days
執行上述程式碼後,該表包含以下內容: