0

我在 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,但我并没有真正做任何更新或插入,所以在这种情况下,过程看起来并不是我应该使用的。不知道如何处理。

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

4

1 回答 1

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

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

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

于 2013-10-02T16:19:06.550 回答