J.D*_*.D. 12 sql-server clustered-index materialized-view sql-server-2016 non-deterministic
我正在尝试创建一个索引视图,其中索引位于视图中的一个字段上,该字段是视图中基础表的一堆列的散列。
下面是一个例子:
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);
Run Code Online (Sandbox Code Playgroud)
当我尝试创建上述索引时,它失败并抛出以下错误:
消息 2729,级别 16,状态 1,第 26 行视图“CoolHashedView”中的列“HashedData”不能用于索引或统计信息或作为分区键,因为它是不确定的。
当我从 HASHBYTEs 函数中删除日期字段时,聚集索引然后成功创建。
我的猜测是它与格式化日期或不同时区的不同方式有关?...我变得更暖和了吗?
Pio*_*otr 27
CAST 不是确定性的,因为日期格式可能会根据服务器设置而改变(即在 110 之前的兼容性下,默认日期格式为 0 =>“2019 年 12 月 12 日 2:11PM”并且输出取决于语言)。
为了使其具有确定性,请使用 CONVERT 和
style 参数必须是常量。此外,小于或等于 100 的样式是不确定的,除了样式 20 和 21。大于 100 的样式是确定的,除了样式 106、107、109 和 113。(来自下面的文档)
更多文档位于:确定性和非确定性函数
| 归档时间: |
|
| 查看次数: |
2052 次 |
| 最近记录: |