我正在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 server2012。已尝试在函数中使用TRY-CATCH语句,但在UDF函数中不能包含TRY-CATCH语句。考虑使用过程并尝试在过程中进行捕获,但我实际上并没有进行任何更新或插入操作,因此在这种情况下,过程看起来似乎并不是我应该使用的。不确定如何处理。

任何帮助将是巨大的!谢谢!

最佳答案

现在已经为此工作了一段时间,但我无法像您理想地希望它那样工作。您已经提到(在您的编辑中)一些我想提到的东西,例如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来处理此问题,甚至更糟。

10-08 06:01
查看更多