Sql-Server
為什麼將 DATE 欄位強制轉換為 VARCHAR 數據類型是不確定的,有沒有辦法使其具有確定性?
我正在嘗試創建一個索引視圖,其中索引位於視圖中的一個欄位上,該欄位是視圖中基礎表的一堆列的雜湊。
這是一個例子:
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。(來自下面的文件)
更多文件位於:確定性和非確定性函式