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。它工作正常。我的表中没有小数部分。因此我删除了该代码。您可以指定您正在运行的数据库服务器吗?您遇到了什么错误??我们看不到你的屏幕-我们看不懂你的心思-你需要告诉我们!能否指定正在运行的数据库服务器?出现了什么错误??我们看不到你的屏幕-我们看不懂你的心思-你需要告诉我们!