SQL 你如何让 udf 在错误时返回 null?

Posted

技术标签:

【中文标题】SQL 你如何让 udf 在错误时返回 null?【英文标题】:SQL How do you make a udf return null on error? 【发布时间】:2013-10-02 13:42:07 【问题描述】:

我在 SQL Server 2008 上运行。我正在选择列类型 varchar 并将每个值转换为 XML 类型。但是,varchar 值可能并不总是正确的 XML 格式。如果不是正确的 XML 格式,我需要打印出“ERROR”然后继续。问题是我不确定如何处理转换错误。尝试在我的选择周围使用 TRY-CATCH,但是当遇到错误时会停止选择。我已经求助于创建一个函数来检查从 varchar 到 XML 的转换是否有效,并且如果转换导致错误,则需要该函数返回 null。我该怎么做?

这是我要转换的数据的非常简化的版本

select dbo.isxml(val)

from (VALUES
('<\fewafeawf'), 
('<XML><STUFF DATA="TEST" /></XML>'),
('<XML>efaweff'))  X(val)

这就是我现在拥有的功能。如果转换失败,无法弄清楚如何调整它以返回 null

create function dbo.isxml(@NT varchar(max)) returns xml
as
begin

declare @output xml

set @output  = cast(@NT as xml)

return @output

end
go

我想要的输出是

NULL
<XML><STUFF DATA="TEST" /></XML>'
NULL

尝试使用 TRY-CONVERT 函数,但这是针对 sql server 2012。尝试在函数中使用 TRY-CATCH 语句,但在 UDF 函数中不能有 TRY-CATCH 语句。考虑过在过程中使用过程和 try-catch,但我并没有真正做任何更新或插入,所以在这种情况下,过程看起来并不像我应该使用的那样。不知道如何处理。

任何帮助都会很棒!谢谢!

【问题讨论】:

【参考方案1】:

我已经为此工作了一段时间,但我无法让它像您理想中的那样工作。你已经(在你的编辑中)提到了一些我要提到的东西,比如 try_cast。

我确实尝试了几件事,但我唯一能开始工作的就是慢。我创建了一个带有输出参数的 SP,您可以在循环/光标中调用它,这可行,但并不理想。

ALTER PROCEDURE dbo.isxml2
    @NT varchar(max),
    @Result xml OUTPUT
AS
BEGIN
    SET NOCOUNT ON

    BEGIN TRY
    set @Result  = cast(@NT as xml)
    END TRY
    BEGIN CATCH
        set @Result = NULL
    END CATCH
END
GO

您唯一的其他选择是不调用 cast(在您的 UDF 中),除非它看起来是 XML。这意味着您必须对其进行测试以查看它是否满足 CAST 工作的要求。

或者,编写一个 CLR 来处理这个问题,甚至更糟。

【讨论】:

以上是关于SQL 你如何让 udf 在错误时返回 null?的主要内容,如果未能解决你的问题,请参考以下文章

如何从函数(UDF)返回表变量?

Excel VBA:不满足条件时如何让UDF返回0

具有多个参数的 PySpark UDF 返回 null

传递值为 null 的变量与传递常量 null 时,Sql Server UDF 的行为不同

如何调用在另一个 UDF 中返回数组的 UDF?

sql server udf,返回与输入表达式相同的类型