在 SQL Server 的表列中使用 UDF 作为默认值

Posted

技术标签:

【中文标题】在 SQL Server 的表列中使用 UDF 作为默认值【英文标题】:Use a UDF as the default value in a table column in SQL Server 【发布时间】:2015-08-04 19:11:00 【问题描述】:

我在 SQL Server 2012 Express 中创建了一个缩放器 UDF(称为 sCurrentAppUser()),我想在定义表时将此 UDF 用作默认值。但每次我尝试时,我都会收到“'sCurrentAppUser' 不是可识别的内置函数名称”的错误。

由于我不能发布超过两个链接(声誉),我将在评论中链接到我的研究和参考。

这是我的 UDF:

ALTER FUNCTION [dbo].[sCurrentAppUser] ()
RETURNS nVarChar(128)
AS BEGIN
   DECLARE @CurrentAppUser nVarChar(128)

   IF EXISTS (SELECT 1 FROM ActiveConnections WHERE ComputerName = host_name ()) BEGIN
      SELECT   @CurrentAppUser = CONVERT (nVarChar(128), LoginUser)
      FROM     ActiveConnections
      WHERE    ComputerName = host_name ()

   END ELSE BEGIN
      SELECT   @CurrentAppUser = Convert (nVarChar(128), suser_sname ())
      WHERE    NOT EXISTS (
                  SELECT   1
                  FROM     ActiveConnections
                  WHERE    ComputerName = host_name ()
               )

   END

   RETURN @CurrentAppUser

END

我尝试在第一列上创建具有默认约束的表:

CREATE TABLE [dbo].[Clients](
   [ModifyingUser] [nvarchar](128) NOT NULL DEFAULT sCurrentAppUser (),
   [Modification] [char](1) NULL DEFAULT 'A',
   [ModifyingHost] [nvarchar](128) NOT NULL DEFAULT host_name (),
   [ClientID] [uniqueidentifier] NOT NULL,
   [Label] [nvarchar](1024) NULL,
   CONSTRAINT [PK_Clients] PRIMARY KEY (
      [ClientID] ASC
   )
)

【问题讨论】:

This page 明确表示“您可以使用标量值 UDF 作为表中列的默认值。” MSDN documentation 并没有说明无法做到这一点。 This forum thread 给出了示例语法,将其视为计算列而不是默认约束,但这对我也不起作用。 this StackExchange question 谈到使用参数化 UDF 作为默认约束,但“答案”谈到根本不使用 UDF。 【参考方案1】:

您应该为该函数添加架构名称:

CREATE TABLE [dbo].[Clients](
   [ModifyingUser] [nvarchar](128) NOT NULL DEFAULT dbo.sCurrentAppUser (),
   [Modification] [char](1) NULL DEFAULT 'A',
   [ModifyingHost] [nvarchar](128) NOT NULL DEFAULT host_name (),
   [ClientID] [uniqueidentifier] NOT NULL,
   [Label] [nvarchar](1024) NULL,
   CONSTRAINT [PK_Clients] PRIMARY KEY (
      [ClientID] ASC
   )
)

【讨论】:

标记为已解决。我只是希望我能给你更多的荣誉,以获得快速和正确的答案。谢谢! 你的意思是使用 dbo.sCurrentAppUser() 而不是 sCurrentAppUser(),很好..

以上是关于在 SQL Server 的表列中使用 UDF 作为默认值的主要内容,如果未能解决你的问题,请参考以下文章

替换SQL Server表列中的文本

如何在SQL Server表列中查找相同值的行

在 SQL Server 中,如何从子查询中标识的表列名称中检索数据值?

如何从 SQL Server 读取 MS Access 数据库以更新一个或多个表列中的数据?

更新 SQL Server 2005 中的表列

如何在 sql server 2008 中获取没有约束的表列?