sql server - 检查是否可以进行强制转换

时间:2013-02-06 00:53:46

标签: sql sql-server sql-server-2008 tsql

我有以下代码将nvarchar转换为整数:

     cast(@value as int)

但是我无法控制参数@value,因此代码可能会失败。无论如何,在进行演员表之前是否有可能检查演员阵容?

6 个答案:

答案 0 :(得分:26)

那么,在SQL Server 2012中,您可以使用新的TRY_CAST(),但是对于SQL Server 2008,您应该能够使用ISNUMERIC(),然后包含对未通过该测试的值的处理

答案 1 :(得分:11)

我最近回答了一个有关此问题的问题,将ISNUMERIC CAST INT用于ISNUMERIC本身并不起作用。原因是,DECLARE @Test nvarchar(10) SET @Test = '1.5' --Works SELECT CASE WHEN @Test NOT LIKE '%[^0-9]%' THEN CAST(@Test as int) ELSE 0 END -- Produces Error SELECT CASE WHEN ISNUMERIC(@Test) = 1 THEN CAST(@Test as int) ELSE 0 END 对于非整数(1.5)返回true,例如。

这是最近关于这个问题的答案:

https://stackoverflow.com/a/14692165/1073631

考虑使用CHARINDEX和ISNUMERIC添加额外的检查,或者我更喜欢,使用正则表达式来验证数据。

这是一个Fiddle,展示了自己使用ISNUMERIC的问题。 Fiddle使用正则表达式代替它。

{{1}}
祝你好运。

答案 2 :(得分:7)

我通常使用以下内容,它似乎涵盖了所有情况。

SELECT CASE WHEN 1 = ISNUMERIC(@value + '.0') THEN CAST(@value as int) ELSE 0 END

它充分利用了" ISNUMERIC"不允许两个时期。 " TRY_CAST"在SQL Server 2012+中是一个更好的解决方案。

答案 3 :(得分:1)

正确的测试是:

select (case when isnumeric(val) = 1 and val not like '%e%' and val not like '%.%'
             then cast(val as int)
        end)

函数isnumeric()对于任何看起来像浮点数的东西都返回1,所以你必须要小心。

你也可以使用我认为是SQL Server的特性。您可以将浮动值1.23强制转换为int,但不能转换字符串值。因此,以下也有效:

select (case when isnumeric(val) = 1
             then cast(cast(val as float) as int)
        end)

答案 4 :(得分:1)

也许我们可以这样做:

declare @value as nvarchar(10) = 'A';

begin try
    select cast(@value as int);
end try
begin catch
-- do something
end catch

答案 5 :(得分:0)

使用带TRY CATCH块的过程来抑制错误

CREATE PROCEDURE p_try_cast
 @type nvarchar(MAX),
 @value nvarchar(MAX)
AS
BEGIN

    BEGIN TRY
        DECLARE @sql        varchar(MAX)
        DECLARE @out_table  TABLE(value varchar(MAX))

        SET @sql = 'SELECT  CONVERT(varchar(max), CAST(''' + @value + ''' AS ' + @type + '))'

        INSERT  @out_table
        EXECUTE (@sql)

        IF EXISTS ( SELECT 1 FROM @out_table WHERE value = @value)
            RETURN 1

        RETURN 0
    END TRY
    BEGIN CATCH
        RETURN 0
    END CATCH

END

GO

现在你可以使用传递的字符串和所需类型调用它,并且proc返回1表示成功,0表示失败

DECLARE @ret int

-- This returns 0 - Fail
EXEC @ret = p_try_cast 'integer', '1.5'

-- This returns 1 - Success
EXEC @ret = p_try_cast 'integer', '1.5'

-- This returns 0 - Fail
EXEC @ret = p_try_cast 'char(4)', 'HELLO'

-- This returns 1 - Success
EXEC @ret = p_try_cast 'char(4)', 'HELL'