【问题标题】:SQL How do you make a udf return null on error?SQL 你如何让 udf 在错误时返回 null?
【发布时间】: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,但我并没有真正做任何更新或插入,所以在这种情况下,过程看起来并不像我应该使用的那样。不知道如何处理。

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

【问题讨论】:

    标签: sql-server sql-server-2008 tsql error-handling sql-convert


    【解决方案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 来处理这个问题,甚至更糟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-14
      • 2013-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2017-04-27
      相关资源
      最近更新 更多