SQL 你如何让 udf 在错误时返回 null?
Posted
技术标签:
【中文标题】SQL 你如何让 udf 在错误时返回 null?【英文标题】:SQL How do you make a udf return null on error? 【发布时间】: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,但我并没有真正做任何更新或插入,所以在这种情况下,过程看起来并不像我应该使用的那样。不知道如何处理。
任何帮助都会很棒!谢谢!
【问题讨论】:
【参考方案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 来处理这个问题,甚至更糟。
【讨论】:
以上是关于SQL 你如何让 udf 在错误时返回 null?的主要内容,如果未能解决你的问题,请参考以下文章