T-SQL标量函数中的错误处理

Cha*_*son 5 error-handling sql-server-2005 function sql-server-2000 type-conversion

这个问题可以很容易地采取多种途径,因此我将首先尝试更具体的路径.在使用SQL Server 2005时,我正在尝试创建一个标量函数,它充当从varchar到int的'TryCast'.我遇到问题的地方是我在函数中添加一个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
Run Code Online (Sandbox Code Playgroud)

事实证明这一陈述存在各种错误,包括"在函数中'开始尝试'中无效使用副作用或时间相关运算符"和"在'END TRY'中无效使用副作用或时间相关运算符'在一个功能中".我似乎无法找到在标量函数中使用try语句的任何示例,这让我想到,函数中的错误处理是否可行?

这里的目标是创建一个强大的Convert或Cast函数版本,以允许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
Run Code Online (Sandbox Code Playgroud)

它永远不会达到丢弃表的程度,因为在尝试将'f'转换为整数时执行会挂起.我希望能够做到这样的事情;

SELECT u_TryCastInt(f1) AS f1_num FROM tblTest

fi_num
__________
1
2
3
0
5
0
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?有什么存在可以解决这个问题吗?另外,我想尝试扩展对话以支持SQL Server 2000,因为在这种情况下Try块不是一个选项.

SQL*_*ace 5

检查你是否可以先转换为int,在这里查看IsInteger函数:IsNumeric,IsInt,IsNumber 它将在2000及以上工作