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不知道它存在),并且实际运行该语句不会产生任何错误。。