我有以下代码投nvarchar的为整:
cast(@value as int)
但是我没有参数@value的控制,因此代码可能会失败。 反正是有检查,如果投在做类型转换之前是可能的吗?
我有以下代码投nvarchar的为整:
cast(@value as int)
但是我没有参数@value的控制,因此代码可能会失败。 反正是有检查,如果投在做类型转换之前是可能的吗?
那么,在SQL Server 2012中,你可以使用新的TRY_CAST() ,但与SQL Server 2008中,你应该能够使用ISNUMERIC() ,然后包括处理对于不通过这个测试值。
我最近回答了这个和使用问题ISNUMERIC
到CAST
到INT
本身不会工作。 原因是, 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
祝好运。
我一般采用下面,似乎涵盖所有的情况。
SELECT CASE WHEN 1 = ISNUMERIC(@value + '.0') THEN CAST(@value as int) ELSE 0 END
它需要的事实,即“ISNUMERIC”将不会允许两个时期的优势。 该“TRY_CAST”在SQL Server 2012+是一个更好的解决方案,但。
正确的测试:
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)
也许我们可以这样做:
declare @value as nvarchar(10) = 'A';
begin try
select cast(@value as int);
end try
begin catch
-- do something
end catch
使用方法与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'