+ -
当前位置:首页 → 问答吧 → 求一个SQL应用问题,SQL server 报错,怎么办?

求一个SQL应用问题,SQL server 报错,怎么办?

时间:2010-08-27

来源:互联网

现在有个表:T ,如下的结构和数据
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 (
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

还真的,刚才没试过。现在试了一下,像你那样写反而没错误。SQl2005下..
复制内容到剪贴板
代码:
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

又发现个 MS 的“智能”的地方啊,isnumeric 对"$1324", "1e1"  结果都是1
看来我要对isnumeric 以后要敬而远之了。。。

作者: xjj2000   发布时间: 2010-08-27

所以考虑用自定函数或者like吧

作者: KarasCanvas   发布时间: 2010-08-27

恩,谢谢KarasCanvas ,非常 kind of 你

把函数写完了,分享给朋友:
复制内容到剪贴板
代码:
--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

相关阅读 更多