Asp.net 如何在sql中将varchar强制转换为int

Asp.net 如何在sql中将varchar强制转换为int,asp.net,sql,sql-server-2000,Asp.net,Sql,Sql Server 2000,我有一个名为ExamInfo的表。在该表中,Sub1列的类型为VARCHAR(50)。Sub1列包含数字、空和非数字数据 我想从检查信息中选择Sub1中的数据大于81的位置 我的问题是: select * from Exam where cast(sub1 as int) > 81`. 但它无法强制转换,导致错误。看起来sub1中的某些数据无法强制转换为int。请检查数据是否为非数字数据。看起来sub1中的某些数据无法强制转换为int。请检查数据是否为非数字数据。因为您的列包含混合信

我有一个名为
ExamInfo
的表。在该表中,
Sub1
列的类型为
VARCHAR(50)
。Sub1列包含数字非数字数据

我想从检查信息中选择Sub1中的数据大于81的位置

我的问题是:

select * 
from Exam 
where cast(sub1 as int) > 81`.

但它无法强制转换,导致错误。

看起来sub1中的某些数据无法强制转换为int。请检查数据是否为非数字数据。

看起来sub1中的某些数据无法强制转换为int。请检查数据是否为非数字数据。

因为您的列包含混合信息,并且强制转换应用于在整列中,您需要确保仅尝试转换实际数值:

select * 
from Exam 
where case when ISNUMERIC(sub1) =1
            and CHARINDEX('.', sub1) = 0 
            and sub1 >= -2147483648 
            and sub1 <= 2147483647
           then cast(sub1 as int) 
           else 0 
      end > 81
这将使查询变成:

DECLARE @decimal_separator char(1)
set @decimal_separator = SUBSTRING(CONVERT(CHAR(3), CONVERT(NUMERIC(2,1), 1.0/2)), 2, 1)

select * 
from Exam 
where case when ISNUMERIC(sub1) =1
            and CHARINDEX(@decimal_separator, sub1) = 0 
            and sub1 >= -2147483648 
            and sub1 <= 2147483647
           then cast(sub1 as int) 
           else 0 
      end > 81
DECLARE@decimal\u分隔符char(1)
set@decimal_separator=子字符串(CONVERT(字符(3),CONVERT(数字(2,1),1.0/2)),2,1)
选择*
从考试
其中,当ISNUMERIC(sub1)=1时的情况
和CHARINDEX(@decimal_分隔符,sub1)=0
和sub1>=-2147483648
及sub181

由于您的列包含混合信息,并且强制转换应用于整个列,因此您需要确保仅尝试强制转换实际数值:

select * 
from Exam 
where case when ISNUMERIC(sub1) =1
            and CHARINDEX('.', sub1) = 0 
            and sub1 >= -2147483648 
            and sub1 <= 2147483647
           then cast(sub1 as int) 
           else 0 
      end > 81
这将使查询变成:

DECLARE @decimal_separator char(1)
set @decimal_separator = SUBSTRING(CONVERT(CHAR(3), CONVERT(NUMERIC(2,1), 1.0/2)), 2, 1)

select * 
from Exam 
where case when ISNUMERIC(sub1) =1
            and CHARINDEX(@decimal_separator, sub1) = 0 
            and sub1 >= -2147483648 
            and sub1 <= 2147483647
           then cast(sub1 as int) 
           else 0 
      end > 81
DECLARE@decimal\u分隔符char(1)
set@decimal_separator=子字符串(CONVERT(字符(3),CONVERT(数字(2,1),1.0/2)),2,1)
选择*
从考试
其中,当ISNUMERIC(sub1)=1时的情况
和CHARINDEX(@decimal_分隔符,sub1)=0
和sub1>=-2147483648
及sub181
试试这个:

 SELECT * FROM ExamInfo
 WHERE  CAST( (CASE 
                WHEN ISNUMERIC(Sub1) <> 1 
                    THEN NULL
                --Ignore any decimal value
                WHEN ISNUMERIC(Sub1 + '.0e0') <> 1                  
                    THEN NULL
                WHEN CAST(Sub1 AS NUMERIC(38, 0)) BETWEEN -2147483648 AND 2147483647
                    THEN Sub1       
                ELSE null 
              END) AS INT ) > 81;
从ExamInfo中选择*
在何处((情况)
当为数字(Sub1)1时
然后无效
--忽略任何十进制值
当为数字时(Sub1+'.0e0')1
然后无效
在-2147483648和2147483647之间进行强制转换时(Sub1为数字(38,0))
然后Sub1
否则无效
结束)如INT)>81;
试试这个:

 SELECT * FROM ExamInfo
 WHERE  CAST( (CASE 
                WHEN ISNUMERIC(Sub1) <> 1 
                    THEN NULL
                --Ignore any decimal value
                WHEN ISNUMERIC(Sub1 + '.0e0') <> 1                  
                    THEN NULL
                WHEN CAST(Sub1 AS NUMERIC(38, 0)) BETWEEN -2147483648 AND 2147483647
                    THEN Sub1       
                ELSE null 
              END) AS INT ) > 81;
从ExamInfo中选择*
在何处((情况)
当为数字(Sub1)1时
然后无效
--忽略任何十进制值
当为数字时(Sub1+'.0e0')1
然后无效
在-2147483648和2147483647之间进行强制转换时(Sub1为数字(38,0))
然后Sub1
否则无效
结束)如INT)>81;

ISNUMERIC
不返回布尔值。您需要测试它是否为
1
。即使这样,它也不能保证它将成功地转换为
int
。我得到了错误。错误是关键字附近的语法不正确。它确实不会测试它是否为int。(并修复了语法错误)我添加了更多整数值检查,还有一些关于如何处理本地化SQL Server的详细信息。感谢Filip De Vos。它工作正常。我的表中没有小数部分。因此我删除了该代码。
ISNUMERIC
不返回布尔值。您需要测试它是否为
1
。即使这样,它也不能保证它将成功地转换为
int
。我得到了错误。错误是关键字附近的语法不正确。它确实不会测试它是否为int。(并修复了语法错误)我添加了更多整数值检查,还有一些关于如何处理本地化SQL server的详细信息。感谢Filip De Vos。它工作正常。我的表中没有小数部分。因此我删除了该代码。您可以指定您正在运行的数据库服务器吗?您遇到了什么错误??我们看不到你的屏幕-我们看不懂你的心思-你需要告诉我们!能否指定正在运行的数据库服务器?出现了什么错误??我们看不到你的屏幕-我们看不懂你的心思-你需要告诉我们!