我有以下代码将nvarchar转换为整数:
cast(@value as int)
但是我无法控制参数@value,因此代码可能会失败。无论如何,在进行演员表之前是否有可能检查演员阵容?
答案 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'