原来我也不用,大段大段的SQL语句,直接写在代码里,后来知道了存储过程,发现这样值参数,效率挺高的。
但现在遇到了问题。就是查询的时候,有很多筛选条件的话,拿 搜人来打个比方
"人"表,可以有 姓名、性别、年龄、学历、所在地、工资……这些字段
默认情况下,用户搜"姓名"即可搜出N多人,可以加筛选条件,年龄、学历等。
原来在程序里写SQL语句,可以这样拼
select * from 人 where 姓名 like %某某%
用户有哪些筛选条件,可以加
and 年龄>20 and 年龄<30可现在改成存储过程的话,这种筛选条件,怎么加啊???

解决方案 »

  1.   

    select * from 。。这种写法能早点改就早点改吧
      

  2.   

    if(姓名<>'')
        set @where =@where+' and 姓名 like''%'+@姓名+'%'''......exec('select 姓名 from 人 '+@where+'')
      

  3.   

    筛选条件同样可以加进去:
    SELECT  姓名,性别,年龄,学历 
    FROM 人
    WHERE 姓名 like '%某某%' AND 年龄 BETWEEN 20 AND 30
    ...
      

  4.   


    ALTER PROCEDURE [dbo].[P_TEST]
    @EmployeeName varchar(50) = '',
    @EmployeeNo varchar(50) = ''
    AS BEGIN
    SELECT * FROM [T_ComparisonInfo] AS [Main] WITH(NOLOCK)
    WHERE (@EmployeeName = '' OR [EmployeeName] = @EmployeeName)
    AND (@EmployeeNo = '' OR [EmployeeNo] = @EmployeeNo)
    END使用存储过程并不是那么神奇,他提升不了多少效率,没有太多意义。拼接SQL比存储过程多了个编译时间,但是几乎感觉不到。在拼接的SQL语句中一样可以使用许多函数,使用好的话,效率不比SQL慢。许多表,只可能在部分页面读写,代码与拼接SQL在一起,反而容易维护。数据量小,但是计算复杂的话,读出来后用C#处理结果比SQL快许多。
      

  5.   

    ifXXXXcase 
       XXXXX
    end
      

  6.   

    可以在存储过程中定义一个sql语句
    declare @sql nvarchar(300)
    根据不同的参数拼接@sql
    最后执行这个sql语句
    exec sp_executesql @sql
      

  7.   

    ALTER PROCEDURE [dbo].[BaseInfo_Select]
    (
     @TableName varchar(50),            --表名
     @ReFieldsStr varchar(max),   --字段名(全部字段为*)
     @OrderString varchar(200),         --排序字段(必须!支持多字段不用加order by)
     @WhereString varchar(4000) --条件语句(不用加where)
    )
    AS
     
    BEGIN    
        Declare @SqlString nvarchar(2000);    
        SET @SqlString = N' select '+@ReFieldsStr+' from '+ @TableName;
        IF (@WhereString! = '' or @WhereString is not null)
            BEGIN
                SET @SqlString =@SqlString+ '  where 1=1 and  '+ @WhereString;            
            END
    BEGIN
    SET @SqlString =@SqlString+ ' order by '+ @OrderString;
    END
        EXEC sp_executesql @SqlString
       
    END
      

  8.   


    这样的东西和拼接SQL没什么不同,甚至更糟糕,因为大部分人都不会在存储过程里的拼接SQL过程中替换掉单引号,结果一样可以SQL注入……
      

  9.   

    这使我想到了另外一个帖子,问orm是不是必须用自己开发的哪一种?!真的奇怪,每一个程序员都可以使用自己喜欢的orm来操作关系数据库,也可以直接使用ado.net,用事实来说话,如果一个程序员写的代码出现了bug的话,别人不喜欢他的orm方法那么删除它重新写自己的就是了。何必纠结于害怕程序员使用自己喜爱的orm方法呢?对于这个问题也是一样的。怎么就说成是必须写存储过程了呢?
      

  10.   

    改用.net以后,就几乎没用过了。
      

  11.   

    现在就在用存储过程。。学习中。。和sql查询差不多,反正能用上去就是好的
    !!
      

  12.   

    存储过程也可以拼接sql语句的嘛,拼完,执行sql字符串exec(sql)
      

  13.   

    我个人觉得吧,用存储过程处理还是很不错的,有时候不需要改动网站的源代码,直接在SQL里改更方便。如果你在页面里有多个查询的话,那可以在SQL存储过程里建几个IF语句,通过传入不同的条件执行不同的查询语句,这样就可以达到效果了,且效率也不差,关键是你在页面代码里要做好传入的条件
      

  14.   

    这不一定的说看个人需要 公司需要我到现在真没用过什么proc...
      

  15.   

    先定义几个你所需要的变量,as后面加查询语句,select后面加where语句,where后面加条件,每个条件后面跟定义的变量,每个条件之间用or隔开。
      

  16.   

    sp1234应该是比较推崇自由编码的.
    很多企业都需要套用模式来做的.唉.比如现在面试的.上来就问会不会MVC啊.会不会XX啊什么的
      

  17.   

    lz可以参考#2的写法.我的查询条件不多.按照#2的样子写还是很简单的...
    然后exec一下.
    #2的写法在拼接的时候也要考虑到一些特殊字符之类的东西...
      

  18.   

    if obeject_id('存储过程名字') is not null
    drop proc '存储过程名字'
    go
    create proc '存储过程名字'
    as
    select * from 人 where 姓名 like %某某% and 年龄>20 and 年龄<30
    go
    exec '存储过程名字'