【问题标题】:User Defined function in SQL not executingSQL 中的用户定义函数未执行
【发布时间】:2023-04-10 05:19:01
【问题描述】:

我正在尝试运行此查询:

SELECT
    [DateAdded], [DateUpdated],
    [dbo].[firstchartoupper]([LastName]) AS [LastName],
    [FirstName], [NPI], [StreetAddress],
    [CITY], [ZIP], [STATE], [Organization],
    [ReportYearMonth], [FileUploadDate] 
FROM
    tt

[dbo].[firstchartoupper] 是我编写的自定义用户定义标量函数

CREATE FUNCTION [dbo].[firstchartoupper]
     (@name AS NVARCHAR(255))
RETURNS NVARCHAR(255)
AS
BEGIN
    DECLARE @CHAR NVARCHAR(1);
    DECLARE @rem NVARCHAR(50);
    DECLARE @output NVARCHAR(255);

    IF @name IS NULL
       RETURN NULL;

    SET @char = SUBSTRING(@name, 1, 1);
    SET @rem = SUBSTRING(@name, 2, LEN(@name));
    SET @output = @char + @rem;

    RETURN @output;
END

但是,我遇到了一个错误

找不到列 dbo 或用户定义的函数或聚合标量

【问题讨论】:

  • 能否检查标量函数文件夹下的DB中是否创建了函数
  • 我认为该 SQL 没有任何问题。您的 SELECT 语句是否在与创建函数的数据库相同的数据库中运行?
  • 换一种说法,该功能试图实现什么?它采用@name 的值并分成两部分,然后将它们连接回来。因此,使用 .like 'Jones' 之类的名称,它将其拆分为 'J''ones' 部分,然后将它们连接回 'Jones'。该函数实际上并没有实现任何目标。
  • 也许他想获取大写的第一个字符。
  • 那么,@Ayan_84,他们将拥有SET @output = UPPER(@char)+@rem;

标签: sql sql-server function


【解决方案1】:

您的函数实际上并没有做任何事情——但它似乎像this dbfiddle 一样“工作”。

这是你想要的表达方式吗?

select stuff(str, 1, 1, upper(left(str, 1)))

这将字符串中的第一个字符大写——这似乎是你想要做的。

【讨论】:

  • 没关系....我在举个例子,但是select语句中发生了错误
【解决方案2】:

您的函数和调用它的 SQL 编写正确。

确保在在正确的数据库上执行创建函数的 SQL,然后再执行使用它的 SELECT(如果在 SSMS 上使用 GO 作为批处理分隔符)。您可以在CREATE FUNCTION 语句之前使用USE DatabaseName 来切换当前连接的数据库。

然后使用这个查询来找到它:

USE DatabaseName

SELECT
    ObjectType = O.type_desc,
    SchemaName = SCHEMA_NAME(O.[schema_id]),
    ObjectName = O.name,
    CreatedDate = O.create_date,
    ModifiedDate = O.modify_date
FROM
    sys.objects AS O
WHERE
    O.type IN ('FN')

如果它没有列出,那么它创建失败或者你在不同的数据库上创建了它。

您可以通过直接提供值来测试您的函数,而无需任何表引用:

SELECT dbo.firstchartoupper(N'Some testing value')

如果它在另一个数据库上,您也可以尝试在架构之前添加数据库名称:

SELECT DatabaseName.dbo.firstchartoupper(N'Some testing value')

【讨论】:

    【解决方案3】:

    首先检查您的函数是否存在于您的数据库中。

      select * from sys.objects where name = 'firstchartoupper' and type_desc = 'SQL_SCALAR_FUNCTION'
    

    如果一切正常,请尝试使用数据库名称进行查询。如下所示

            SELECT
                [DateAdded], [DateUpdated],
                [yourdbname].[dbo].[firstchartoupper]([LastName]) AS [LastName],
                [FirstName], [NPI], [StreetAddress],
                [CITY], [ZIP], [STATE], [Organization],
                [ReportYearMonth], [FileUploadDate] 
            FROM
                tt
    

    【讨论】:

      【解决方案4】:

      显然,sql server 似乎没有检测到该功能。我只是然后 ctrl+f5 然后在管理工作室中 f5 它。它工作了

      【讨论】:

      • 我怀疑这是解决方案,事实上。 Ctrl+F5 是 SSMS for Parse 中的快捷键。我怀疑我们在这里被带进了兔子洞。 OP 没有收到对象在运行时不存在的错误,但在对象名称下方有一条红色的“波浪线”,因为他们没有更新他们的智能感知。结果他们“认为”该对象不存在,但它确实存在(只是 SSMS 不知道它确实存在)并且实际运行该语句不会产生任何错误..
      猜你喜欢
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多