SQL 过早退出标量函数

Posted

技术标签:

【中文标题】SQL 过早退出标量函数【英文标题】:SQL Exit scalar function prematurely 【发布时间】:2021-02-10 20:24:14 【问题描述】:

在 SQL 中,您可以使用 RETURN 语句提前退出存储过程。

-- CHECK IF IT IS A VALID AND EXISTING JOB NAME
IF NOT EXISTS (SELECT * FROM msdb..sysjobs WHERE name = @job_name)
BEGIN
    RAISERROR ('[ERROR]:[%s] job does not exist. Please check',16, 1, @job_name) WITH LOG
    RETURN
END

但是,当我尝试将相同的原理应用于标量函数时,它会返回错误,因为函数需要返回一些东西。

CREATE FUNCTION [dbo].[fn_GetJobStatus]
    (@job_name SYSNAME)
RETURNS INT
WITH EXECUTE AS CALLER
AS
BEGIN
    DECLARE @JobCompletionStatus INT;

    -- CHECK IF IT IS A VALID AND EXISTING JOB NAME
    IF NOT EXISTS (SELECT * FROM msdb..sysjobs WHERE name = @job_name)
    BEGIN
        RAISERROR ('[ERROR]:[%s] job does not exist. Please check',16, 1, @job_name) WITH LOG
        RETURN   <--ERROR HERE
    END
    
    <!--Scalar function logic here -->

    RETURN @JobCompletionStatus;
END

如何像在存储过程中使用 RETURN 一样提前退出标量函数?

谢谢。

【问题讨论】:

返回一些东西。 . .以return -1 为例。 @GordonLinoff 这也是我的想法,只返回 0。阻碍我的是我的函数返回 INT。这不会被视为有效的价值回报吗?我只是想退出该功能。 【参考方案1】:

您也不能在函数中使用 RAISERROR 或 THROW。听起来您确实想要一个带有输出参数或结果集的存储过程。

【讨论】:

谢谢!然后我将删除 RAISERROR 语句。但是,如果我还想提前退出标量函数怎么办?只需返回 -1? 如果你 return -1 那么你真的必须从单行 TSQL 调用函数并检查返回值。在这一点上,有一个功能是没有意义的。函数是您在 SQL 查询中调用或与复杂表达式中的其他运算符组合的 TSQL 代码片段。这就是它们存在的原因,这就是为什么对函数可以做什么有限制的原因。存储过程是 TSQL 中通用的过程代码封装机制。 谢谢。如果是这种情况,我需要改变方法。但总的来说,我是否正确理解您不能过早退出标量函数? 没有像set @JobCompletionStatus = 1/0; 这样的俗气,是的,你理解正确。此外,您始终可以返回 NULL,这很难误认为是有效的返回值。

以上是关于SQL 过早退出标量函数的主要内容,如果未能解决你的问题,请参考以下文章

sql 标量函数

从标量 SQL 函数返回两个值

SQL Server - 将标量函数转换为表值函数

从 Linq Query 调用 SQL 标量函数

从 sql 程序调用用户定义的标量函数

sql MS SQL简单标量函数