【发布时间】:2010-12-17 04:45:28
【问题描述】:
我创建了一个 UDF,用于为列生成默认值。它工作得很好,但我想将另一个字段作为参数传递给函数。这可能吗?
例如,其中一个字段是 DealerID 字段,我想将 DealerID 字段的值传入我的 UDF,因为我将使用它来计算新值。任何帮助将不胜感激!
【问题讨论】:
标签: sql-server user-defined-functions
我创建了一个 UDF,用于为列生成默认值。它工作得很好,但我想将另一个字段作为参数传递给函数。这可能吗?
例如,其中一个字段是 DealerID 字段,我想将 DealerID 字段的值传入我的 UDF,因为我将使用它来计算新值。任何帮助将不胜感激!
【问题讨论】:
标签: sql-server user-defined-functions
不,因为在知道 DealerID 之前需要默认值(例如在 INSERT 上)
编辑:
这意味着SQL Server在插入的时候没有表中的值,只有插入之后。因此,它不能作为默认的UDF。
例如,多行插入怎么样,或者你有 NEWID() 默认值?
现在,在 DealerID 上使用基本逻辑:如果是 GUID,为什么?这是一个内部的、非用户可读的值。
如果你真的需要这个,你必须使用一个计算列作为“基础”值,并使用另一个列作为具有 ISNULL 的“实际”值。
【讨论】:
我有一个类似的问题,我想为插入到表中的新记录自动分配一个 URL slug。我采用的方法是将字段的默认值设置为“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
【讨论】:
如果您有需要使用 UDF 的特定原因,请更正我,但为什么不直接为表 DDL 中的列定义默认值,如果您在 @ 中提供特定值,则该列将被覆盖987654321@、INSERT 等?在 SELECT 中使用 UDF 将导致函数在每一行都执行,如果在表定义级别进行处理,您将节省开销。
【讨论】: