Рекомендации по Вычисляемому столбцу в SQL Server

Я работаю с пользовательской таблицей и хочу поставить "дату окончания испытательного срока". В принципе, у каждого нового пользователя есть 2 полных месяца с момента присоединения в рамках испытательного срока. Я видел, что могу поместить формулу в столбец для моей пользовательской таблицы, но мне интересно, должен ли я иметь скрипт, который обновляет это вместо этого, или это приемлемое время для использования вычисляемых столбцов. Я получаю доступ к этой таблице для различных вещей и иногда обновляю строку пользователей на основе этапа производительности достижения. Дата подачи заявки никогда не изменится / не будет обновляться.

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

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

(dateadd(day,(-1),dateadd(month,(3),dateadd(day,(1)-datepart(day,[APP_DT]),[APP_DT]))))

3 ответов


видя, что эта дата, скорее всего, никогда не изменится после ее установки, это, вероятно, не хороший кандидат для вычисляемого столбца.

В конце концов: как только вы вставляете строку в эту таблицу, вы можете легко вычислить эту дату "конец испытательного срока" прямо там и тогда (например, в триггере), и как только она будет установлена, эта дата никогда не изменится.

поэтому, хотя вы определенно можете сделать это таким образом, я, вероятно, предпочел бы использовать AFTER INSERT trigger (или хранимая процедура для INSERT операция), который просто вычисляет его один раз, а затем сохраняет эту дату.

кроме того, так же, как хедз-ап: вычисляемый столбец только с формулой вычисляется каждый раз, чтобы получить к нему доступ - просто знайте об этом. То есть, если вы не укажете PERSISTED ключевое слово, в этом случае результат сохраняется вдоль других данных в строке, и это было бы намного лучше подходит здесь - снова, так как это значение, после вычисления, не обязательно изменится когда-либо снова.


Если вы хотите позже продлить чей-то испытательный срок без изменения даты их применения, то вычисляемый столбец-это не путь. Почему бы просто не использовать DEFAULT ограничение для обоих столбцов?

USE tempdb;
GO

CREATE TABLE dbo.foo
(
  MemberID INT IDENTITY(1,1),
  JoinDate DATE NOT NULL DEFAULT SYSDATETIME(),
  ProbationEndDate NOT NULL DEFAULT 
    DATEADD(DAY, -1, DATEADD(MONTH, DATEDIFF(MONTH,0,SYSDATETIME())+3, 0))
);

INSERT dbo.foo DEFAULT VALUES;

SELECT MemberID, JoinDate, ProbationEndDate FROM dbo.foo;

результаты:

MemberID    JoinDate      ProbationEndDate
--------    ----------    ----------------
1           2013-04-05    2013-06-30

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


нет накладных расходов при вставке данных; только когда вы читаете столбец, значения вычисляются для этого столбца. Поэтому я бы сказал, что ваш подход верен.