如何基于另一列定义计算的约束列

时间:2017-09-26 07:11:39

标签: sql sql-server tsql calculated-columns

我想使用Scalar-valued function

为基于另一列的列添加默认约束

这是一个例子:

CREATE TABLE [MyTable] 
(
    [Id] [int] NOT NULL
    [ScrambledId] [int] NOT NULL
)

ALTER TABLE [MyTable] ADD DEFAULT (dbo.MakeItScrambled([Id])) FOR [ScrambledId]

CREATE function [dbo].MakeItScrambled(@Value int)
BEGIN
    --Some logic
    retrun @ScrambledValue
END

我需要根据列[ScrambledId]

对列[Id]进行加扰

似乎不允许使用列名:

  

名称" Id"在这种情况下是不允许的。有效的表达式是   常量,常量表达式和(在某些上下文中)变量。   不允许使用列名。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您尚未添加已创建普通列的计算列,并尝试向其添加默认值。您无法在默认约束中引用其他列。

修改:这会引发错误:

  

Computed column' ScrambledId'因为列不能持久化   是非确定性的

如果你想要一个计算列,那么在表定义中使用...... [ScrambledId] AS dbo.MakeItScrambled([Id]) PERSISTED - 我建议在基于标量函数进行计算时使用持久化。

或者,您可以在插入或更新[Id]时添加更新/插入触发器以设置[ScrambledId]的值。