我在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但我实际上并没有进行任何更新或插入,因此在这种情况下,程序看起来并不像我应该使用的那样。不知道如何处理这个。
任何帮助都会很棒!谢谢!
答案 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来处理这个问题,甚至是最差的。