【问题标题】:Why is my CASE expression non-deterministic?为什么我的 CASE 表达式是不确定的?
【发布时间】:2011-01-30 23:56:51
【问题描述】:

我正在尝试使用 CASE 表达式创建一个持久计算列:

ALTER TABLE dbo.Calendar ADD PreviousDate AS 
case WHEN [Date]>'20100101' THEN  [Date]
    ELSE NULL
    END PERSISTED

MSDN 明确表示 CASE 是确定性的,here

但是,我收到一个错误:

消息 4936,第 16 级,状态 1,第 1 行 计算列“PreviousDate”在 表“日历”无法持久化 因为该列是 非确定性的。

当然,我可以创建一个标量 UDF 并将其明确声明为确定性,但是有没有更简单的方法呢?我已经在获取最新的服务包了。谢谢。

【问题讨论】:

  • 老问题,我知道,但是您如何建议在 SQL Server 中“创建标量 UDF 并将其明确声明为确定性”。我听说你可以在 Oracle 中这样做,但我从未在 SQL Server 中看到过这种方法......

标签: sql sql-server sql-server-2008 calculated-columns persisted-column


【解决方案1】:

你需要CONVERT '20100101' with a style.

源或目标类型是日期时间或 smalldatetime,其他来源或 目标类型是字符串,并且 指定了不确定的样式。

那么,试试这个:

...WHEN [Date] > CONVERT(datetime, '20100101', 112)....

从字符串中解析日期可能不可靠,因为 I've answered before (mostly in comments)

编辑:

我不会说这是一个错误,但 SQL Server 要求 100% 澄清。 yyyymmdd 不是 ISO,SQL Server 解析 yyyy-mm-dd 不可靠(见我的回答链接)

【讨论】:

    【解决方案2】:

    显然它对数据类型非常挑剔。尝试这样做:

    ALTER TABLE dbo.Calendar ADD PreviousDate AS 
    case WHEN [Date ]> Convert(DateTime, '20100101', 101) THEN  [Date]
        ELSE Convert(DateTime, NULL, 101)
        END PERSISTED
    

    【讨论】:

    • 不幸的是,我无法将两个回复都标记为答案,所以我只标记了第一个,并为你的回复点赞。谢谢!
    猜你喜欢
    • 2018-02-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多