【问题标题】:Computed column '...' in table '...' cannot be persisted because the column is non-deterministic? [duplicate]表“...”中的计算列“...”无法持久化,因为该列是不确定的? [复制]
【发布时间】:2019-12-21 10:13:46
【问题描述】:

我有以下功能。

create FUNCTION [dbo].[Valid](@c char(9))
RETURNs bit
as
begin
    DECLARE @sum int = 0;
    return 0 
end

还有下面的SQL

create table test(A char(10))
alter table test add C as dbo.Valid(A) persisted;

有错误

消息 4936,第 16 级,状态 1,第 50 行

表“test”中的计算列“C”无法持久化,因为该列是不确定的。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    函数必须使用WITH SCHEMABINDING 提示进行修饰,否则 SQL Server 会跳过确定性验证(一种性能优化),并将默认结果视为非确定性。

    【讨论】:

      【解决方案2】:

      正如 Elaskanator 所说,您应该在函数定义中添加WITH SCHEMABINDING,如下所示:

      alter FUNCTION [dbo].[Valid](@c char(9))
      RETURNS BIT WITH SCHEMABINDING
      as
      begin
          DECLARE @sum int = 0;
          return 0 
      END
      
      create table test(A char(10))
      alter table test add C AS dbo.Valid(A) persisted;
      

      更多信息:https://www.mssqltips.com/sqlservertip/3338/change-all-computed-columns-to-persisted-in-sql-server/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-16
        • 2010-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多