Sql-Server

獲取今天日期的確定性函式

  • March 20, 2020

我正在嘗試使用以下程式碼創建索引視圖(以便我可以將其發布以將其複制為表):

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執行上述程式碼後,該表包含以下內容:

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/121996