Henry

曾经沧海难为水,除却巫山不是云,取次花丛懒回顾,半缘修道半缘君。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

今天在创建一个表的时候,发现在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 不是确定性函数,因为总是使用相同的参数唤醒调用它,而它在每次执行时返回结果都不同。

 

最后的解释,就是版本不同造成的 ,以后也尽量避免使用获取周这种不确定性函数作为计算列。

 

 

posted on 2011-05-04 10:31  Henry.Lau  阅读(617)  评论(0编辑  收藏  举报