Вычисляемый столбец не может быть сохранен - PullRequest
26 голосов
/ 14 ноября 2009

У меня есть пользовательская функция, и я пытаюсь создать постоянный столбец, используя эту функцию.

Это дает мне следующую ошибку.

Вычисляемый столбец «FormattedSSN» в таблице «SomeTable» не может быть сохранен, поскольку столбец недетерминирован.

Вот функция:

ALTER FUNCTION [dbo].[FormatSSN]()
RETURNS VARCHAR(11)
AS
BEGIN
    return '';
END

Вот запрос для добавления столбца с помощью функции:

ALTER TABLE SomeTable
ADD FormattedSSN as dbo.FormatSSN() PERSISTED

Пожалуйста, предложите, если есть какой-либо выход. Спасибо.

Ответы [ 4 ]

38 голосов
/ 14 ноября 2009

Добавить со схемой к функции, подобной этой:

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

и затем выполните это, чтобы проверить:

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

Работает здесь.

5 голосов
/ 14 ноября 2009

Как насчет указания определения напрямую:

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
3 голосов
/ 14 ноября 2009

Вместо вызова UDF, установите выражение вычисляемого столбца в

Case When Len(EmployeeSSN) = 0 Then 
      SUBSTRING(EmployeeSSN, 1, 3) + '-' + 
      SUBSTRING(EmployeeSSN, 4, 2) + '-' + 
      SUBSTRING(EmployeeSSN, 6, 4)
    Else EmployeeSSN End

В сценарии создания таблицы вы можете добавить столбец:

[NewColumnName]  As
   (Case When len([UpdateUserId])=(0) T
         Then (((substring([UpdateUserId],(1),(3))+'-')+
                 substring([UpdateUserId],(4),(2)))+'-')+
                 substring([UpdateUserId],(6),(4)) 
         Else [UpdateUserId] End) PERSISTED,
1 голос
/ 29 апреля 2016

Создать невычисляемый столбец с соответствующим типом данных. Создайте триггер вставки (и триггер обновления, если данные изменятся). Затем вы можете сохранить вывод функции в столбце.

ALTER TABLE SomeTable ADD FormattedSSN VARCHAR(11)
GO

CREATE TRIGGER dbo.TR_I_SomeTable ON  dbo.SomeTable AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    update s
    set s.FormattedSSN = dbo.FormatSSN()
    from SomeTable AS s
        join inserted i on i.id = s.id

END
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...