2017-09-26 79 views
0

我想添加一个默认的限制使用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]

看来,列名是不允许的:

The name "Id" is not permitted in this context. Valid expressions are constants, constant expressions, and (in some contexts) variables. Column names are not permitted.

有什么建议吗?

回答

1

您尚未添加已创建正常列的计算列,并尝试向其添加默认值。您不能在默认约束中引用另一列。

编辑:这将引发错误:

Computed column 'ScrambledId' cannot be persisted because the column is non-deterministic

如果你想计算的列然后在表定义使用... [ScrambledId] AS dbo.MakeItScrambled([Id]) PERSISTED - 我建议你在哪里calcuting基于使用持续一个标量函数。

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

+0

我试过你的第一种方法,我得到一个错误:计算列'ScrambledId'不能被持续,因为列是非确定性的。 –

+1

嗯,是害怕那与一个标量函数..... 2选项然后,要么删除持续,并重新计算读或创建一个更新/插入触发器 – SQLBadPanda