Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL如何使udf在出现错误时返回null?_Sql Server_Sql Server 2008_Tsql_Error Handling_Sql Convert - Fatal编程技术网

Sql server SQL如何使udf在出现错误时返回null?

Sql server SQL如何使udf在出现错误时返回null?,sql-server,sql-server-2008,tsql,error-handling,sql-convert,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 db

我正在运行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
<XML><STUFF DATA="TEST" /></XML>'
NULL
NULL
'
无效的
已尝试使用TRY-CONVERT函数,但该函数适用于sql server 2012。已尝试在函数中使用TRY-CATCH语句,但无法在UDF函数中使用TRY-CATCH语句。考虑过使用过程并在过程中尝试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
您唯一的另一个选择是不调用cast(在您的UDF中),除非它看起来是XML。这意味着您必须对其进行测试,以查看它是否满足CAST工作的要求

或者,编写一个CLR来处理这个问题,甚至是最糟糕的问题

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