Sql-Server

為什麼將 DATE 欄位強制轉換為 VARCHAR 數據類型是不確定的,有沒有辦法使其具有確定性?

  • December 12, 2019

我正在嘗試創建一個索引視圖,其中索引位於視圖中的一個欄位上,該欄位是視圖中基礎表的一堆列的雜湊。

這是一個例子:

CREATE VIEW CoolHashedView WITH SCHEMABINDING AS

   SELECT 
       KeyId,
       CONVERT
       (
           VARCHAR(34), 
           HASHBYTES('MD5', TextColumn1 + '||' + TextColumn2 + '||' + CAST(DateColumn1 AS VARCHAR(50)), 
           2
       ) AS HashedData
   FROM dbo.BoringTable;

   CREATE UNIQUE CLUSTERED INDEX IX_CoolHashedView_KeyId_HashedData ON CoolHashedView (KeyId, HashedData);

當我嘗試創建上述索引時,它失敗並引發以下錯誤:

消息 2729,級別 16,狀態 1,第 26 行視圖 ‘CoolHashedView’ 中的列 ‘HashedData’ 不能用於索引或統計資訊或作為分區鍵,因為它是不確定的。

當我從 HASHBYTEs 函式中刪除日期欄位時,聚集索引然後成功創建。

我的猜測是它與格式化日期或不同時區的不同方式有關?…我變暖了嗎?

CAST 不是確定性的,因為日期格式可能會根據伺服器設置而改變(即在 110 之前的兼容性下,預設日期格式為 0 =>“Dec 12 2019 2:11PM”並且輸出取決於語言)。

為了使其具有確定性,請使用 CONVERT 和

樣式參數必須是常量。此外,小於或等於 100 的樣式是不確定的,除了樣式 20 和 21。大於 100 的樣式是確定的,除了樣式 106、107、109 和 113。(來自下面的文件)

更多文件位於:確定性和非確定性函式

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