【问题标题】:Using UDF for default value of a column使用 UDF 作为列的默认值
【发布时间】:2010-12-17 04:45:28
【问题描述】:

我创建了一个 UDF,用于为列生成默认值。它工作得很好,但我想将另一个字段作为参数传递给函数。这可能吗?

例如,其中一个字段是 DealerID 字段,我想将 DealerID 字段的值传入我的 UDF,因为我将使用它来计算新值。任何帮助将不胜感激!

【问题讨论】:

    标签: sql-server user-defined-functions


    【解决方案1】:

    不,因为在知道 DealerID 之前需要默认值(例如在 INSERT 上)

    编辑:

    这意味着SQL Server在插入的时候没有表中的值,只有插入之后。因此,它不能作为默认的UDF。

    例如,多行插入怎么样,或者你有 NEWID() 默认值?

    现在,在 DealerID 上使用基本逻辑:如果是 GUID,为什么?这是一个内部的、非用户可读的值。

    如果你真的需要这个,你必须使用一个计算列作为“基础”值,并使用另一个列作为具有 ISNULL 的“实际”值。

    【讨论】:

    • 我想我想用触发器来做,我不知道怎么做,有什么建议吗?
    【解决方案2】:

    我有一个类似的问题,我想为插入到表中的新记录自动分配一个 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
    

    【讨论】:

      【解决方案3】:

      如果您有需要使用 UDF 的特定原因,请更正我,但为什么不直接为表 DDL 中的列定义默认值,如果您在 @ 中提供特定值,则该列将被覆盖987654321@、INSERT 等?在 SELECT 中使用 UDF 将导致函数在每一行都执行,如果在表定义级别进行处理,您将节省开销。

      【讨论】:

      • 我正在尝试做一个公式来计算默认值,这就是我尝试使用 UDF 的原因。
      • 一个很好的理由可能是在多租户数据库中,您要使用的默认值特定于拥有所插入记录的业务/客户。例如:插入新文档记录时,您可能想要将“未分配”文档组 ID 分配给它。在当前约束下,中间层必须查找“未分配”文档组 ID 本身并将其包含在 INSERT 语句的值中。
      猜你喜欢
      • 2015-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      相关资源
      最近更新 更多