Этот вопрос может легко занять несколько путей, поэтому сначала я выберу более конкретный путь. Работая с SQL Server 2005, я пытаюсь создать скалярную функцию, которая действует как TryCast от varchar до int. Я сталкиваюсь с проблемой, когда добавляю блок TRY в функцию;
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
Оказывается, что в этом утверждении есть все виды неправильных вещей, включая «Недопустимое использование побочного или зависящего от времени оператора в« НАЧАТЬ ИДЕТ »внутри функции» и «Недопустимое использование побочного или зависящего от времени оператора в «КОНЕЦ ПОПРОБУЙТЕ» в функции ». Кажется, я не могу найти никаких примеров использования операторов try внутри скалярной функции, что заставило меня задуматься о том, возможна ли обработка ошибок в функции?
Целью здесь является создание надежной версии функций Convert или Cast, чтобы оператор SELECT мог переносить ошибки преобразования с места. Например, возьмите следующее:
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 в этом сценарии недоступны.