我正在尝试运行此查询:
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列或用户定义的函数或聚合标量
答案 0 :(得分:0)
您的函数实际上没有执行任何操作,但是似乎可以像this db <> fiddle那样“起作用”。
这是您想要的表达方式吗?
select stuff(str, 1, 1, upper(left(str, 1)))
这是大写的字符串中的第一个字符-这似乎就是您想要的。
答案 1 :(得分:0)
您的函数和正确调用它的SQL。
请确保执行在适当的数据库上创建函数的SQL ,并在执行使用该函数的SELECT
之前执行(如果在SSMS上使用GO
作为批处理分隔符) 。您可以在USE DatabaseName
语句之前使用CREATE FUNCTION
来切换当前连接的数据库。
然后使用此查询找到它:
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')
答案 2 :(得分:0)
首先检查您的函数是否已经存在于数据库中。
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
答案 3 :(得分:0)
显然,似乎sql server没有检测到该功能。我只是先按ctrl + f5,然后在Management Studio中按f5。