2017-09-26 91 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