感谢您浏览我的帖子。
在查询页面中有一个文本框,可输入值进行查询,并且输入值中以逗号分开,可以实现联合查询。
比如:“姓名”字段输入:刘小华,陈小刚
那么查询后,结果可以显示为刘小华、陈小刚两条记录。
这样的话,存储过程就不能固定参数个数,用户可能输入一个或者几个参数,请教这样的存储过程该怎样写!

解决方案 »

  1.   

    name = 刘小华 or 陈小刚
      

  2.   

    用StringBuilder吧
    将SQL语句的条件循环添加
      

  3.   

    以SQL语句把字符串“刘小华,陈小刚”拆开不就行了吗,或者不用存储过程,这样的情况我没有用存储过程,直接在C#里把“刘小华,陈小刚”转换成WHERE子句传过去
      

  4.   

    再次感谢楼上各位的答复。TO:cjzlxy(享受孤独) 
    我是说存储过程参数不固定,而不是只是查询两个参数。TO: yaopeng117(尋找屬於自己的道,堅定不移的走下去。) 
    能说的具体点吗?
      

  5.   

    TO:dutguoyi(新鲜鱼排)
    只是为了方便用户可以一次性输入自己所要查询的条件,就可以查出自己所有想要看到的信息TO:zhangguochen(中和)
    不用存储过程确实可以,用递归的SELECT语句在C#程序中可以实现。但是为了安全,我所有的数据操作只能用存储过程,所以在这里跟大家讨论。
      

  6.   

    在存储过程用传入你输入的字符串,然后sql='select * from 表 where 字段 in('+你输入的字符串+')',生成你的select 字符串exec(sql)不就可以了吗?
      

  7.   

    1、考虑使用非关系数据库。
    2、扩展存储过程。
    3、需求变化不是很大的时候,理论上讲用T-SQL可以实现,不过,非常非常非常的麻烦。
      

  8.   

    “刘小华,陈小刚,...”作为一个参数(@str)传给存储过程
    @str = '姓名 = ''' + replace(@str, ',', ''' or 姓名 = ''') + ''''
    结果:
         姓名 = '刘小华' or 姓名 = '陈小刚'
      

  9.   

    TO:3gold(新丁) 
    你的法子需要用户输入精确的值,比如:输入刘小华,陈小刚可以,当时如果输入刘,陈,就不行了,呵呵
      

  10.   

    TO:ccat(智拙) 
    还请详加指教。TO:lufancy(奇闻共欣赏,异议相与析) 
    用变量来作为SQL语句的一部分,是不可以的。
      

  11.   

    晕!!!!!!!!!!!!!
    刚才的回复全没有了
    CSDN 赔偿~我想到2种方法
    1。用动态sql,将名字组合起来~ 但这样速度会比较慢
    2。考虑用表变量(或临时表)
      例如可以传参数'allan|john|kenny|kelly|'然后用自定义函数取出来
     放到表变量里面 再关联就可以了参考:
    CREATE FUNCTION [dbo].[code_split] (@str varchar(8000),@i int)
    RETURNS varchar(30)  AS  
    BEGIN    declare @intCurPost int 
       declare @IP varchar(30)
       declare @zero int
       declare @len int
       set @zero=0
                                                       -- 'ddddddddd#^ddddddddd#^dddddddd#^ssssssssss#^dddddddddd'    -- set @intCurPost=charindex('#^',@str) 
       --  if @intCurPost>0
      
         while @i >=@zero
                 begin
                      set @intCurPost=charindex('|',@str,0) 
                      if(@intCurPost>0)  
                           begin                            set @IP=substring(@str,1,@intCurPost-1);                          
                               set  @zero=@zero+1
                               if(@zero=@i)
                                  break                           set @len=len(@str)                           set @str=right(@str,@len-@intCurPost) 
                                
                               end 
                        else 
                          begin                          if @i=@zero+1
                                begin
                                   set @IP=@str
                                    break
                                 end
                             else
                                begin
                                     set @IP='#^error#^'
                                     break
                                end
                              
                          end 
                          
    END
         return   @IPEND
      

  12.   

    TO: yukingwq(古鲁)
    非常感谢你的帮助可能我没有表达清楚,或者对数据库操作还比较肤浅实际上,我希望在存储过程中最后形成这样的SQL语句:
    select * from 表 where (name like '%刘小华%') and (name like '%陈%') and (name like '%...这样的话,我从C#中产生READER就可以读取这些数据。当时难题就在用户输入的参数不固定,可能是一个或者几个,甚至有的参数只是记录内容的一部分,所以要实现动态参数输入。头疼的地方就在这里
      

  13.   

    TO:lovvver(春晖) 
    拆开可以,可是怎样合成一条SELECT语句呢?
      

  14.   

    这样实现不是很高效 
    最好用表变量(临时表)的关联来实现如果非要这样 可以考虑用动态sql 来实现@paramexec ('http://210.77.155.240/regBeta2/regservice.asmx '+
    @param)
    @param ,you may build it from the page
      

  15.   

    存储过程中执行spexecutesql @sql, 后面加参数...
      

  16.   

    动态 SQL,可用 sp_executesql 解决,也可用 exec @sql
      

  17.   

    TO: yukingwq(古鲁)
    看来也只有这种方式可以一试了非常感谢各位的回复!!!
      

  18.   

    http://dotnetjunkies.com/weblog/seichert/posts/308.aspx
      

  19.   

    TO:kingbao(大宝)   bflovesnow() 
    declare @sql nvarchar(1000)
    declare @sql_temp nvarchar(100)
    set @sql_temp='company_id=14 or company_id=15'
    set @sql='select * from company where'
    set @sql=@sql+@sql_temp
    exec sp_executesql @sql
    请帮我看看这段代码错在哪里?
    提示错误:
    服务器: 消息 170,级别 15,状态 1,行 1
    第 1 行: '=' 附近有语法错误。
      

  20.   

    TO:athossmth(athos)
    文章所描述的解决方法跟我要求的不是一码事
      

  21.   

    我现在正在试 yukingwq(古鲁)和kingbao(大宝)   bflovesnow() 的法子,如果可以,我会将最后的解决方法与大家共享
    谢谢大家
      

  22.   

    通过楼上诸位的启发,终于解决了。现拿出来与大家共享
    首先在程序中把name文本框中的值变成:
    (name like '%'+'刘'+'%') and (name like '%'+'陈'+'%') and (name like '%'+...
    然后传入存储过程参数@name
    @sql='select * from [name] where '
    @sql=@sql+@name
    exec sp_executesql @sql
    即可尽管这个存储过程写的很麻烦(耗费了一天时间),不过,我从中学到很多东西,感谢大家的帮助!
      

  23.   

    楼上的做法,如果name文本框中没有文本,岂不是要查出所有的记录了?name like '%'+''+'%' 呵呵