今天在创建一个表的时候,发现在mssql05上创建成功,08上报错
CREATE TABLE TA
(
id INT,
writetime DATETIME,
wk AS (DATEPART(wk,writetime)) persisted
)
消息 4936,级别 16,状态 1,第 1 行
无法持久化表 'TA' 中的计算列 'wk',因为此列不具有确定性。
其实就是计算列的持久化与非持久化的问题,
persisted:表示数据持久到本地硬盘中
如果是非持久化,数据则不保存在硬盘,而是在内存中查询的时候计算一次,这对于大数据量存在性能能力
对于上述的报错,参考资料如下
函数 | 确定性 |
---|---|
DATEADD | 具有确定性 |
DATEDIFF | 具有确定性 |
DATENAME | 不具有确定性 |
DATEPART | 除了用作 DATEPART (dw, date) 外都具有确定性。dw 是工作日的日期部分,取决于由设置每周第一天的 SET DATEFIRST 所设置的值。 |
DAY | 具有确定性 |
GETDATE | 不具有确定性 |
GETUTCDATE | 不具有确定性 |
MONTH | 具有确定性 |
YEAR | 具有确定性 |
所有的函数都是确定性或非确定性的:
- 在使用特定的输入值集调用确定性函数的任何时候,它们总是返回相同的结果。
- 在每次使用特定的输入值集调用非确定性函数时,它们可能返回不同的结果。
函数是否为确定性函数或非确定性函数称为函数的确定性。
例如,DATEADD 内置函数是确定性函数,因为对于其三个参数的任何给定参数值集总是返回相同的结果。GETDATE 不是确定性函数,因为总是使用相同的参数唤醒调用它,而它在每次执行时返回结果都不同。
最后的解释,就是版本不同造成的 ,以后也尽量避免使用获取周这种不确定性函数作为计算列。