Использование UDF для значения столбца по умолчанию - PullRequest
1 голос
/ 16 ноября 2009

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

Например, одно из полей является полем DealerID, и я хочу передать значение поля DealerID в свой UDF, потому что я буду использовать его для вычисления нового значения. Любая помощь будет оценена!

Ответы [ 3 ]

3 голосов
/ 16 ноября 2009

Нет, потому что значение по умолчанию будет необходимо до того, как станет известен DealerID (например, на INSERT)

Edit:

Это означает, что SQL Server не указывает значение в таблице на момент вставки, а только после. Следовательно, он не может быть UDF по умолчанию.

Например, как насчет многострочной вставки или где по умолчанию используется NEWID ()?

Теперь, используя базовую логику на DealerID: если это GUID, почему? Это внутреннее, не читаемое пользователем значение.

Если вам это действительно нужно, вам придется использовать вычисляемый столбец для «базового» значения и другой столбец для «фактического» значения с ISNULL.

3 голосов
/ 06 сентября 2012

У меня была похожая проблема, когда я хотел автоматически назначить URL-адрес для новых записей, вставленных в таблицу. Подход, который я выбрал, состоял в том, чтобы установить значение по умолчанию для поля «NOTSET» (просто значение заполнителя текста), а затем использовать триггер вставки, чтобы обновить поле «ON INSERT» до значения моего UDF (где значение поля равно «NOTSET») следующим образом:

CREATE TRIGGER [dbo].[TR_MyTable_MyTriggerName] 
   ON  [dbo].[tblMyTable]
   AFTER INSERT
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Create the geography field from the lat and lon coordinates
    UPDATE tblMyTable
    SET fldURLSlug = dbo.UDF_MyFunction(INS.[fldRecordTitle])
    FROM tblMyTable MT INNER JOIN inserted INS ON MT.fldRecordId = INS.fldRecordId
    WHERE INS.fldURLSlug = 'NOTSET'

END

GO
0 голосов
/ 16 ноября 2009

Пожалуйста, исправьте меня, если у вас есть конкретная причина, почему вам нужно использовать UDF, но почему бы просто не определить значение по умолчанию для столбца в вашей таблице DDL, которое затем будет перезаписано, если вы укажете конкретное значение в вашем UPDATE, INSERT и т. Д.? Использование UDF в SELECT приведет к тому, что функция будет выполняться в каждой строке, а накладные расходы будут сохранены, если об этом позаботиться на уровне определения таблицы.

...