| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1475 人关注过本帖
标题:求助,关于SQL中根据字符匹配查询的问题
只看楼主 加入收藏
yutianyi
Rank: 2
等 级:论坛游民
帖 子:113
专家分:12
注 册:2008-7-18
结帖率:90.91%
收藏
 问题点数:0 回复次数:2 
求助,关于SQL中根据字符匹配查询的问题
问题简述如下:
报告表中有个分类编码字段HS,其中有几种分类用“、”隔开 如 85、89、90
公司表中也有个分类编码字段HS,其中有几种分类用“、”隔开 如 85、52、60

现在需要根据报告中分类码查询与报告有相同分类码的公司(一个相同即可,如:报告HS为 85、89、90    公司HS为 85、52、60    则该公司应该被查询出来)


我原来的思路是先把公司HS码截取出来循环传入下面所写的存储过程中查询,可是严重超时,请各位大哥帮忙解决下,谢谢了!

--存储过程
CREATE PROCEDURE GetSendWarnCorporation
    @TbtHS varchar(10)  --包包中截取后传入的HS
 AS
    DECLARE MyCURSOR CURSOR FOR SELECT [ID],HS  FROM Corporation
    --打开游标
    open MyCURSOR
    declare @HS varchar(100)  --公司的HS分类
    declare @HSsub varchar(10) --截取的HS
    declare @ID int --公司编号
    declare @StrSql varchar(1000) --得到的查询集合
    declare @flg bit --标记
    declare @end int --HS中顿号截取位置
    set @StrSql='('
            
           --循环移动
    fetch next from MyCURSOR into @ID,@HS
    while(@@fetch_status=0)
        set @flg=0
      begin
       while(@flg=0 and len(@HS)>0)        
       begin
        set @end = PATINDEX('%、%', @HS) --得到第一次出现'、'的位置
        set @HSsub = SUBSTRING(@HS, 0, @end) --截取
        set @HS =  SUBSTRING(@HS, @end,len(@HS)) --截取
        if(@TbtHS=@HSsub)
        begin            
                    set @StrSql = @StrSql + ','''+Convert(varchar,@ID)+''''
                    set @flg=1
        end
        if(@TbtHS=@HS)
        begin            
                    set @StrSql = @StrSql + ','''+Convert(varchar,@ID)+''''
                    set @flg=1
        end
       end
        fetch next from MyCURSOR into @HS
      end

    close MyCURSOR
    deallocate MyCURSOR
    set @StrSql = @StrSql+')'
    exec ’select * from Corporation where [ID] in '+ @StrSql
GO
搜索更多相关主题的帖子: SQL 字符 查询 
2008-09-10 16:36
hebingbing
Rank: 6Rank: 6
来 自:黄土高坡
等 级:贵宾
威 望:27
帖 子:3417
专家分:371
注 册:2007-10-22
收藏
得分:0 
这个的确是一个比较棘手的问题……
数据量太有些大了,怎么查都应该比较耗时的……
暂时想不出来什么好的方法……
不过你试试这样看能不能提高一点速度,我想是应该可以提高一点的……
可以考虑not in或者in,这样就不用截取了,不对这样就少截取了一个即:
你截取了公司的HS的第一个数字a,然后a in(报告表的HS)这样应该能提高一点吧……
楼主可以试试……
2008-09-10 21:29
yutianyi
Rank: 2
等 级:论坛游民
帖 子:113
专家分:12
注 册:2008-7-18
收藏
得分:0 
谢谢版主!
昨天仔细看了下是字符串截取的循环写错了引起死循环超时。改正之后速度还可以,数据库里就几千条数据基本可以应付
改过之后的存储过程如下:
CREATE PROCEDURE GetSendWarnCorporation
    @TbtHS varchar(10)
 AS
    DECLARE MyCURSOR CURSOR FOR SELECT [ID],HS  FROM Corporation
    --打开游标
    open MyCURSOR
    declare @HS varchar(100)  --公司的HS分类
    declare @HSsub varchar(10) --截取的HS
    declare @ID int --公司编号
    declare @StrSql varchar(1000) --得到的查询集合
    declare @flg bit --标记
    declare @end int --HS中顿号截取位置
    declare @i int
    set @StrSql='(''0'''
             set @i=0
           --循环移动
    fetch next from MyCURSOR into @ID,@HS
    while(@@fetch_status=0)            
      begin
        set @end=1    
      while(@end>0)        
       begin
        set @i=@i+1
        set @end = PATINDEX('%、%', @HS) --得到第一次出现'、'的位置
        set @HSsub = SUBSTRING(@HS, 0, @end) --截取
        set @HS =  SUBSTRING(@HS, @end+1,len(@HS)) --截取
        if(@TbtHS=@HSsub)
        begin            
                    set @StrSql = @StrSql + ','''+Convert(varchar,@ID)+''''             
                    break
        end
        if(@TbtHS=@HS)
        begin            
                    set @StrSql = @StrSql + ','''+Convert(varchar,@ID)+''''              
                                       break
        end
        
       end
        fetch next from MyCURSOR  into @ID,@HS
      end    
    close MyCURSOR
    deallocate MyCURSOR
    set @StrSql = @StrSql+')'
    exec('select * from Corporation where [ID] in'+ @StrSql)  --查询相关公司
GO
--------------------------------------------------
主要是set @HS =  SUBSTRING(@HS, @end+1,len(@HS)) 中 @end要加1,否则剩下的字符就会变成  、52、60   而不是预想要的   52、60
2008-09-12 09:46
快速回复:求助,关于SQL中根据字符匹配查询的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035018 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved