3

Этот вопрос может легко принять несколько путей, поэтому сначала я нажму более конкретный путь. Во время работы с SQL Server 2005 я пытаюсь создать скалярную функцию, которая действует как «TryCast» от varchar до int. Где я столкнулся с проблемой, когда я добавляю блок TRY в функцию;Обработка ошибок в скалярной функции T-SQL

CREATE FUNCTION u_TryCastInt 
(
    @Value as VARCHAR(MAX) 
) 
RETURNS Int 
AS 
BEGIN 
    DECLARE @Output AS Int 

    BEGIN TRY 
     SET @Output = CONVERT(Int, @Value) 
    END TRY 
    BEGIN CATCH 
     SET @Output = 0 
    END CATCH 

    RETURN @Output 
END 

Оказывается Theres все виды вещей неправильно с этим утверждением, включая «Invalid использование в нем побочные или зависящего от времени оператора„BEGIN TRY“в функции» и «неправильное использование в нем побочные или времени -зависимый оператор в «END TRY» внутри функции ». Кажется, я не могу найти примеры использования инструкций try в скалярной функции, которая заставила меня задуматься, возможна ли обработка ошибок в функции?

Цель состоит в том, чтобы создать надежную версию функций преобразования или трансляции, чтобы оператор SELECT выполнял ошибки преобразования depsite. Например, возьмите следующее:

CREATE TABLE tblTest 
    (
     f1 VARCHAR(50) 
    ) 
    GO 

    INSERT INTO tblTest(f1) VALUES('1') 
    INSERT INTO tblTest(f1) VALUES('2') 
    INSERT INTO tblTest(f1) VALUES('3') 
    INSERT INTO tblTest(f1) VALUES('f') 
    INSERT INTO tblTest(f1) VALUES('5') 
    INSERT INTO tblTest(f1) VALUES('1.1') 

    SELECT CONVERT(int,f1) AS f1_num FROM tblTest 

    DROP TABLE tblTest 

Это никогда не достигает точки отбрасывания таблицы, потому что выполнение зависает при попытке преобразования 'f' в целое число. Я хочу быть в состоянии сделать что-то вроде этого;

SELECT u_TryCastInt(f1) AS f1_num FROM tblTest 

fi_num 
__________ 
1 
2 
3 
0 
5 
0 

Любые мысли об этом? Есть ли что-то, что существует для этого? Кроме того, я хотел бы попытаться расширить разговор для поддержки SQL Server 2000, так как в этом сценарии нет возможности использовать блоки Try.

+0

Для вашего конкретного случая использования, это может помочь. http://www.tek-tips.com/faqs.cfm?fid=6423 –

ответ

4

Проверить, если вы можете преобразовать в целое первых, проверить функцию IsInteger здесь: IsNumeric, IsInt, IsNumber Он будет работать на 2000 и до

2

И, чтобы ответить вообще: Нет, вы не можете использовать примерочных поймать логику в функции. Я могу понять, почему - или, по крайней мере, явно предпочтительнее избегать этого, учитывая огромный штраф за производительность, который придет с ним.

Тем не менее, я считаю странным, что он также не может поднять ошибку в функции ... это уже встроенные функции. Я полагаю, что нужно получить, вернув NULL.

1

Конструкция TRY ... CATCH не может использоваться в пользовательской функции в SQL 2012!

Смотреть это: http://msdn.microsoft.com/en-us/library/ms175976.aspx

Когда я пытаюсь использовать этот скрипт:

CREATE FUNCTION u_TryCastInt 
(
    @Value as VARCHAR(MAX) 
) 
RETURNS Int 
AS 
BEGIN 
    DECLARE @Output AS Int 

    BEGIN TRY 
     SET @Output = CONVERT(Int, @Value) 
    END TRY 
    BEGIN CATCH 
     SET @Output = 0 
    END CATCH 

    RETURN @Output 
END 

я получил ошибку:

Msg 443, Level 16, State 14, Procedure u_TryCastInt, Line 10
Invalid use of a side-effecting operator 'BEGIN TRY' within a function.
Msg 443, Level 16, State 14, Procedure u_TryCastInt, Line 12
Invalid use of a side-effecting operator 'END TRY' within a function.
Msg 443, Level 16, State 14, Procedure u_TryCastInt, Line 13
Invalid use of a side-effecting operator 'BEGIN CATCH' within a function.
Msg 443, Level 16, State 14, Procedure u_TryCastInt, Line 15
Invalid use of a side-effecting operator 'END CATCH' within a function.

Смежные вопросы