计算列不能保留

noo*_*spt 26 sql sql-server

我有一个自定义函数,我正在尝试使用此函数创建一个持久列.

它给了我以下错误.

表'SomeTable'中的计算列'FormattedSSN'无法保留,因为该列是非确定性的.

这是功能:

ALTER FUNCTION [dbo].[FormatSSN]()
RETURNS VARCHAR(11)
AS
BEGIN
    return '';
END
Run Code Online (Sandbox Code Playgroud)

以下是使用函数添加列的查询:

ALTER TABLE SomeTable
ADD FormattedSSN as dbo.FormatSSN() PERSISTED
Run Code Online (Sandbox Code Playgroud)

如果有任何出路,请建议.谢谢.

Dam*_*vic 38

WITH SCHEMABINDING添加到函数中,如下所示:

ALTER FUNCTION [dbo].[FormatSSN]
(
@SSN    VARCHAR(9)
)
RETURNS CHAR(11)
WITH SCHEMABINDING
AS
BEGIN
  your stuff here
END
Run Code Online (Sandbox Code Playgroud)

然后运行它来验证:

IF OBJECTPROPERTY (OBJECT_ID(N'[dbo].[FormatSSN]'),'IsDeterministic') = 1
   PRINT 'Function is detrministic.'
ELSE IF OBJECTPROPERTY (OBJECT_ID(N'[dbo].[FormatSSN]'),'IsDeterministic') = 0
   PRINT 'Function is NOT detrministic'
GO
Run Code Online (Sandbox Code Playgroud)

在这里工作.


小智 5

如何直接指定定义:

ALTER TABLE SomeTable
ADD FormattedSSN as
    case when len(EmployeeSSN) = 9 then
            substring(EmployeeSSN, 1, 3) + '-' +
            substring(EmployeeSSN, 4, 2) + '-' +
            substring(EmployeeSSN, 6, 4)
    else EmployeeSSN end
PERSISTED
Run Code Online (Sandbox Code Playgroud)

  • 引擎无法分辨UDF可能具有的副作用,因为它可以在以后修改,并且每次运行时都会重新计算它的缓存计划.当将计算列表示为SQL表达式时,它知道没有非确定性副作用. (2认同)