Как подавить или игнорировать ошибки в операторе SQL SELECT - PullRequest
5 голосов
/ 24 декабря 2010

Кто-нибудь знает, как подавить / игнорировать ошибки в операторе выбора?

Мой оператор выбора использует функцию STLineFromText, и когда он попадает в недопустимую строку, он вызывает ошибку. Я в порядке игнорирования плохих строк и не могу реально изменить мои исходные данные.

Вот пример запроса, который демонстрирует мою проблему:

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

Спасибо!

Ответы [ 2 ]

3 голосов
/ 24 декабря 2010

Так что я укусила пулю и написала свою собственную функцию 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

Кредиты:

http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx

http://msdn.microsoft.com/en-us/library/ms131065.aspx

1 голос
/ 24 декабря 2010

Нет; чтобы ответить на исходный вопрос, нельзя просто заставить SQL Server «игнорировать» ошибки. Единственный способ сделать это на стороне сервера - создать UDF, который принимает те же параметры, что и STLineFromText, но включает вызов в блок try / catch и возвращает null в случае исключение.

ОК, поцарапайте это, поскольку вы не можете try / catch в функции. Однако вы могли бы определить 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

Это, конечно, мерзость. У меня нет SSMS передо мной, но даже если это не компилируется, этого должно быть по крайней мере достаточно, чтобы настроить его на что-то, что делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...