SQL如何在出错时使udf返回null?

时间:2013-10-02 13:42:08

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

我在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 个答案:

答案 0 :(得分:0)

现在已经有一段时间了,我无法让它像你理想的那样工作。你已经提到了(在你的编辑中)我要提到的一些事情,比如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

你唯一的另一个选择是不要调用强制转换(在你的UDF中),除非它看起来像是XML。这意味着您必须对其进行测试,以确定它是否符合CAST的工作要求。

或者,写一个CLR来处理这个问题,甚至是最差的。