Этот вопрос может легко принять несколько путей, поэтому сначала я нажму более конкретный путь. Во время работы с 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.
Для вашего конкретного случая использования, это может помочь. http://www.tek-tips.com/faqs.cfm?fid=6423 –