Как определить вычисляемый ограниченный столбец на основе другого столбца

Я хотел бы добавить ограничение по умолчанию для столбца на основе другого столбца, используя 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» в этом контексте не допускается. Допустимые выражения — это константы, константные выражения и (в некоторых контекстах) переменные. Имена столбцов не разрешены.

Какие-либо предложения?


person Shahar Shokrani    schedule 26.09.2017    source источник


Ответы (1)


Вы не добавили вычисляемый столбец, вы создали обычный столбец и попытались добавить к нему значение по умолчанию. Вы не можете ссылаться на другой столбец в ограничении по умолчанию.

Изменить: это вызовет ошибку:

Вычисляемый столбец "ScrambledId" не может быть сохранен, так как столбец не является детерминированным.

Если вам нужен вычисляемый столбец, используйте в определении таблицы... [ScrambledId] AS dbo.MakeItScrambled([Id]) PERSISTED — я бы предложил использовать persisted там, где вы вычисляете на основе скалярной функции.

В качестве альтернативы вы можете добавить триггер обновления/вставки для установки значения [ScrambledId] при вставке или обновлении [Id].

person SQLBadPanda    schedule 26.09.2017
comment
Я попробовал ваш первый подход и получаю сообщение об ошибке: вычисляемый столбец «ScrambledId» не может быть сохранен, поскольку столбец не является детерминированным. - person Shahar Shokrani; 26.09.2017
comment
Хм, я боялся этого со скалярной функцией..... Затем 2 варианта: либо удалить сохраненное и пересчитать его при чтении, либо создать триггер обновления/вставки. - person SQLBadPanda; 26.09.2017