在 SQL 中调用标量值函数

Posted

技术标签:

【中文标题】在 SQL 中调用标量值函数【英文标题】:Calling Scalar-valued Functions in SQL 【发布时间】:2011-11-08 16:19:27 【问题描述】:

我从 oracle 迁移了一个数据库,现在有一些标量值函数。

但是,当我打电话给他们时,我收到一条错误消息:

找不到列“dbo”或用户定义函数或聚合“dbo.chk_mgr”,或者名称不明确。

我这样称呼它:

SELECT dbo.chk_mgr('asdf')

我做错了什么?

【问题讨论】:

您能告诉我们有关函数的CREATE 语句吗? 另外,当你说你正在调用它时,你是如何/从哪里调用它的?也许您在没有意识到的情况下指向了错误的数据库? 我刚遇到这个问题。 @TomH 的评论是正确的答案。投票最多的答案对我来说是一个红鲱鱼,因为(就像问题所说的那样)我实际上使用的是标量值函数。 【参考方案1】:

你确定不是Table-Valued Function

我问的原因:

CREATE FUNCTION dbo.chk_mgr(@mgr VARCHAR(50)) 
RETURNS @mgr_table TABLE (mgr_name VARCHAR(50))
AS
BEGIN 
  INSERT @mgr_table (mgr_name) VALUES ('pointy haired boss') 
  RETURN
END 
GO

SELECT dbo.chk_mgr('asdf')
GO

结果:

Msg 4121, Level 16, State 1, Line 1
Cannot find either column "dbo" or the user-defined function 
or aggregate "dbo.chk_mgr", or the name is ambiguous.

不过……

SELECT * FROM dbo.chk_mgr('asdf') 

mgr_name
------------------
pointy haired boss

【讨论】:

【参考方案2】:

可以做到以下几点

PRINT dbo.[FunctionName] ( [Parameter/Argument] )

例如:

PRINT dbo.StringSplit('77,54')

【讨论】:

【参考方案3】:

这种语法对我来说很好用:

CREATE FUNCTION dbo.test_func
(@in varchar(20))
RETURNS INT
AS
BEGIN
    RETURN 1
END
GO

SELECT dbo.test_func('blah')

您确定该函数作为函数存在并且在 dbo 架构下吗?

【讨论】:

SELECT * 也不适合我。上面的语法完美运行。【参考方案4】:

您正在使用内联表值函数。因此,您必须使用 Select * From 函数。 如果你想使用 select function() 你必须使用一个标量函数。

https://msdn.microsoft.com/fr-fr/library/ms186755%28v=sql.120%29.aspx

【讨论】:

【参考方案5】:

确保您选择了正确的数据库。如果您尝试在新的查询窗口中运行它,您可能选择了主数据库。

【讨论】:

以上是关于在 SQL 中调用标量值函数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用sql server数据库中的标量值函数

调用在 Entity Framework Core 中返回标量值的存储过程 [重复]

从 .NET 调用表值 SQL 函数

在 Java 中调用 SQL Server 用户定义函数 (UDF)

预期标量值:MATLAB Coder

在 SQL Server 中计算 GS1 校验位的标量值函数