.net 如何抑制或忽略SQL SELECT语句中的错误

.net 如何抑制或忽略SQL SELECT语句中的错误,.net,sql,sql-server,tsql,error-handling,.net,Sql,Sql Server,Tsql,Error Handling,有人知道如何抑制/忽略select语句中的错误吗 我的select语句使用STLINEFORMTEXT函数,当它遇到无效行时,会引发错误。我可以忽略坏行,并且不能真正更改源数据 下面是一个示例查询,演示了我的问题: SELECT geography::STLineFromText('LINESTRING(-74.2204037952351 40.4283173372472,-74.2204851952350 40.4283519372471)', 4326) UNION ALL SELECT g

有人知道如何抑制/忽略select语句中的错误吗

我的select语句使用STLINEFORMTEXT函数,当它遇到无效行时,会引发错误。我可以忽略坏行,并且不能真正更改源数据

下面是一个示例查询,演示了我的问题:

SELECT geography::STLineFromText('LINESTRING(-74.2204037952351 40.4283173372472,-74.2204851952350 40.4283519372471)', 4326) UNION ALL
SELECT geography::STLineFromText('LINESTRING(-74.2316367952177 40.4386102038979,-74.2313671952181 40.4388540705641)', 4326) UNION ALL
SELECT geography::STLineFromText('LINESTRING(-74.2229282618978 40.4252709372519,-74.2229171285645 40.4252638039186,-74.2229282618978 40.4252709372519,-74.2227441952315 40.4251499372521,-74.2231121285642 40.4243291372534)', 4326) UNION ALL
SELECT geography::STLineFromText('LINESTRING(-74.2418989952017 40.4417621372263,-74.2417773285352 40.4417915372263)', 4326) UNION ALL
SELECT geography::STLineFromText('LINESTRING(-74.2166069952410 40.4334496039059,-74.2158269952422 40.4336396039056)', 4326)
下面是错误:

Msg 6522, Level 16, State 1, Line 2
A .NET Framework error occurred during execution of user-defined routine or aggregate "geography": 
System.ArgumentException: 24200: The specified input does not represent a valid geography instance.
System.ArgumentException: 
   at Microsoft.SqlServer.Types.SqlGeography.ConstructGeographyFromUserInput(GeoData g, Int32 srid)
   at Microsoft.SqlServer.Types.SqlGeography.GeographyFromText(OpenGisType type, SqlChars taggedText, Int32 srid)
理想的情况是只返回1、2、4和5,忽略3


谢谢

No;要回答您最初的问题,您不能简单地让SQL Server忽略错误。在服务器端执行此操作的唯一方法是创建一个UDF,该UDF采用与STLineFromText相同的参数,但将调用封装在try/catch块中,并在出现异常时返回null

好吧,把它划掉,因为你不能在函数中尝试/捕捉。但是,您可以定义一个UDF,它是将值作为参数的存储过程的OPENQUERY调用的传递。然后你可以去喝一杯烈性饮料

类似于

CREATE PROCEDURE SP_IgnoreErrors(@value varchar(255), @param int)
AS
BEGIN
    BEGIN TRY
        SELECT geography::STLineFromText(@value, @param) AS VALUE
    END TRY
    BEGIN CATCH
        SELECT NULL AS VALUE
    END CATCH
END

CREATE FUNCTION IgnoreErrors(@value varchar(255), @param int) RETURNS XXX
AS
BEGIN
    DECLARE @output XXX

    SELECT @output = VALUE from OPENQUERY([YOURINSTANCE],'Database.dbo.SP_IgnoreErrors ''' + @value + ''', ' + convert(varchar, @param))

    RETURN @output
END

当然,这是一件令人憎恶的事情。我面前没有SSM,但即使它不能编译,它至少应该足以继续将它调整为可以编译的东西。

所以我咬紧牙关,编写了自己的CLR函数,以便可以合并一个try/catch。它运行得很好

<Microsoft.SqlServer.Server.SqlFunction()> _
Public Shared Function STLineFromTextFlexible(ByVal LineString As SqlChars, ByVal SRID As Integer) As Microsoft.SqlServer.Types.SqlGeography
    Try
        Dim Geo As New SqlGeography()

        Geo = SqlGeography.STLineFromText(LineString, SRID)

        Return Geo
    Catch ex As Exception
        Return Nothing
    End Try
End Function
学分:


实际上,我只是写了同样的建议来回应MainMa。我认为这可能是最好的选择。我将尝试并报告它的工作情况。太棒了,你不能在UDF中使用try/catch块。或者任何关于这个问题的错误处理…@Tom:我不一定主张这样做,但是如果您非常想这样做,那么您可以创建一个将值作为参数的存储过程,然后使用OPENQUERY从UDF中的结果中进行选择。虽然不太理想,甚至不太接近,但它应该会起作用。