mssql 05 与08 计算列的处理

今天在创建一个表的时候,发现在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 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/Henry1225/archive/2011/05/04/2036213.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值