SQL中的用户定义函数未执行

SQL中的用户定义函数未执行,sql,sql-server,function,Sql,Sql Server,Function,我正在尝试运行此查询: SELECT [DateAdded], [DateUpdated], [dbo].[firstchartoupper]([LastName]) AS [LastName], [FirstName], [NPI], [StreetAddress], [CITY], [ZIP], [STATE], [Organization], [ReportYearMonth], [FileUploadDate] FROM tt [dbo

我正在尝试运行此查询:

SELECT
    [DateAdded], [DateUpdated],
    [dbo].[firstchartoupper]([LastName]) AS [LastName],
    [FirstName], [NPI], [StreetAddress],
    [CITY], [ZIP], [STATE], [Organization],
    [ReportYearMonth], [FileUploadDate] 
FROM
    tt
[dbo].[firstchartupper]
是我编写的自定义用户定义标量函数

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或用户定义函数或聚合标量


您的函数实际上并没有做任何事情——但它看起来像在dbfiddle中一样“工作”

这是你想要的表达方式吗

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

这个大写字母表示字符串中的第一个字符,这似乎是您想要执行的操作。

您的函数实际上没有执行任何操作,但它似乎与dbfiddle中的一样“工作”

这是你想要的表达方式吗

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

这个大写字母表示字符串中的第一个字符,这似乎是您想要执行的操作。

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

确保在适当的数据库上执行创建函数的SQL,并且在执行使用函数的SQL之前,选择使用函数的SQL(如果在SSMS上,则使用批处理分隔符)。您可以在
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')

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

确保在适当的数据库上执行创建函数的SQL,并且在执行使用函数的SQL之前,选择使用函数的SQL(如果在SSMS上,则使用批处理分隔符)。您可以在
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')

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

  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

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

  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

GO

显然,sql server似乎没有检测到该功能。我只是在management studio中按ctrl+f5,然后再按f5。它显然起作用了

,sql server似乎没有检测到该函数。我只是在management studio中按ctrl+f5,然后再按f5键。它起作用了

你能检查该函数是否在标量函数folderI下的DB中创建吗?我看不出该sql有什么问题。您的
SELECT
语句是否在中创建函数的同一数据库中运行?请注意,该函数试图实现什么?它将
@name
的值拆分为两部分,然后将它们连接回来。因此,使用一个名称。如
'Jones'
,它将其分成
'J'
'one'
两部分,然后将它们连接回
'Jones'
。这个函数实际上没有实现任何功能。也许他想得到大写的第一个字符。然后,@Ayan_84,他们将
设置@output=UPPER(+@char)+@rem
您可以检查标量函数folderI下的函数是否在DB中创建吗?我看不出该SQL有什么问题。您的
SELECT
语句是否在中创建函数的同一数据库中运行?请注意,该函数试图实现什么?它将
@name
的值拆分为两部分,然后将它们连接回来。因此,使用一个名称。如
'Jones'
,它将其分成
'J'
'one'
两部分,然后将它们连接回
'Jones'
。这个函数实际上没有实现任何功能。也许他想得到大写的第一个字符。然后,@Ayan_84,他们将
设置@output=UPPER(+@char)+@rem这很好…我举个例子,但错误发生在select语句中。这很好…我举个例子,但错误发生在select语句中。事实上,我怀疑这是解决方案。Ctrl+F5是SSMS中解析的快捷键。我怀疑我们是被带到兔子洞里来的;OP没有得到一个错误,即对象在运行时不存在,但在对象名称下有一条红色的“扭曲”线,因为他们没有更新intellisense。结果,他们“认为”对象不存在,但它确实存在(只是SSMS不知道它存在),并且实际运行该语句不会产生任何错误……事实上,我怀疑这是解决方案。Ctrl+F5是SSMS中解析的快捷键。我怀疑我们是被带到兔子洞里来的;OP没有得到一个错误,即对象在运行时不存在,但在对象名称下有一条红色的“扭曲”线,因为他们没有更新intellisense。因此,他们“认为”该对象不存在,但它确实存在(只是SSMS不知道它存在),并且实际运行该语句不会产生任何错误。。