SQL服务器 - 检查,看看是否转换是可能的(sql server - check to see i

2019-07-19 08:52发布

我有以下代码投nvarchar的为整:

     cast(@value as int)

但是我没有参数@value的控制,因此代码可能会失败。 反正是有检查,如果投在做类型转换之前是可能的吗?

Answer 1:

那么,在SQL Server 2012中,你可以使用新的TRY_CAST() ,但与SQL Server 2008中,你应该能够使用ISNUMERIC() ,然后包括处理对于不通过这个测试值。



Answer 2:

我最近回答了这个和使用问题ISNUMERICCASTINT本身不会工作。 原因是, ISNUMERIC返回非整数(1.5)例如真。

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

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

考虑添加使用CHARINDEX与ISNUMERIC额外的检查,或者是我愿意的话,使用正则表达式来验证数据。

这里是一个小提琴展示问题,它自己使用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 

祝好运。



Answer 3:

我一般采用下面,似乎涵盖所有的情况。

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

它需要的事实,即“ISNUMERIC”将不会允许两个时期的优势。 该“TRY_CAST”在SQL Server 2012+是一个更好的解决方案,但。



Answer 4:

正确的测试:

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)


Answer 5:

也许我们可以这样做:

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

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


Answer 6:

使用方法与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'


文章来源: sql server - check to see if cast is possible