求一个SQL应用问题,SQL server 报错,怎么办?
时间:2010-08-27
来源:互联网
name [char(10)] age [int] idchar [char(15)]
-----------------------------------------------------------------
Ham 12 5646
Lisa 14 ABC3395
Kavin 30 NTFS
-----------------------------------------------------------------
现在执行以下语句:
SELECT idchar
FROM T
WHERE (isnumeric(idchar) = 1) AND (CAST(idchar AS INT) BETWEEN 0 AND 999999)
这句会报错,原因是CAST 不能将ABC3395之类的数据转换成INT, 可是最前面是用isnumeric先进行了判断的,似乎后面的先执行,这个问题怎么解决呢?请曾经遇到过的高手帮帮忙,先谢了!!
作者: xjj2000 发布时间: 2010-08-27
SELECT idchar
FROM T
WHERE (isnumeric(idchar) = 1)
)tt where CAST(idchar AS INT) BETWEEN 0 AND 999999
作者: KarasCanvas 发布时间: 2010-08-27
还有,我现在维护的是一个很大的SQL,我只是把其中报错的部分隔离出来了,所以,请尽量不要改动SQL的结构,不然,我要改结构的话就要晕过去了。。。
作者: xjj2000 发布时间: 2010-08-27
代码:
declare @t table( [idchar] char(15) )insert into @t
select '5646' union all
select 'adfe352' union all
select '&x342' union all
select 'NTFS' union all
select null union all
select '3423423'
select * from @t where IsNumeric(idchar) = 1
select * from @t where (IsNumeric(idchar) = 1) and (CAST(idchar AS INT) BETWEEN 0 AND 999999)
select idchar from (
select idchar from @t where IsNumeric(idchar) = 1
)tt where CAST(idchar AS INT) BETWEEN 0 AND 999999
作者: KarasCanvas 发布时间: 2010-08-27
select * from @t where dbo.IsValidChar(idchar) = 1
代码:
create function IsValidChar(@input char(15)
)
returns int
as
begin
declare @val int
set @val = 0
if IsNumeric(@input) = 1
begin
if cast(@input as int) between 0 and 999999
set @val = 1
end
return @val
end
作者: KarasCanvas 发布时间: 2010-08-27
只是领导不让用函数啊,说是速度慢。。。。
为什么你上面回复的那个,两种方式都不报错了??我晕,我继续研究研究
作者: xjj2000 发布时间: 2010-08-27
纯粹是扯淡么,IsNumeric和Cast就是函数...
作者: KarasCanvas 发布时间: 2010-08-27
很奇怪,表变量就不会报错,可能是数据库执行的时候不会对SQL where子句进行优化,所以没报错
作者: xjj2000 发布时间: 2010-08-27
狂晕中。。。。
作者: xjj2000 发布时间: 2010-08-27
看来我要对isnumeric 以后要敬而远之了。。。
作者: xjj2000 发布时间: 2010-08-27
作者: KarasCanvas 发布时间: 2010-08-27

把函数写完了,分享给朋友:
代码:
--Created by Joe, 2010-08-26--if @s is INT return 1 else return 0
--empty string will return 0
--string only consist of spaces will return 0
ALTER FUNCTION isInt(@s VARCHAR(255))
RETURNS INT
BEGIN
DECLARE @ret AS INT
SET @s=ltrim(rtrim(@s))
IF len(@s)=0 OR charindex(' ',@s)<>0
SET @ret=0
ELSE
BEGIN
SET @s=replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(@s,'0',''),'1',''),'2',''),'3',''),'4',''),'5',''),'6',''),'7',''),'8',''),'9','')
IF len(@s)<>0
SET @ret=0
ELSE
SET @ret=1
END
RETURN @ret
END
[ 本帖最后由 xjj2000 于 2010-8-27 12:10 编辑 ]
作者: xjj2000 发布时间: 2010-08-27
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28