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 过早退出标量函数的主要内容,如果未能解决你的问题,请参考以下文章