来自 澳门威尼斯人注册网站 2019-12-12 06:27 的文章
当前位置: 澳门威尼斯人平台 > 澳门威尼斯人注册网站 > 正文

关于存储过程可空条件查询

图片 1

mysql 存储过程多条件查询
我在做一个查询成绩的系统,打算在mysql里面创建一个存储过程,参数例如:学号,姓名,成绩,
现在我要查成绩,假如传入的参数是null则不匹配,比如参数列表(null,姓名,成绩),那么查询语句就是 select * from table where name = '姓名' and score = '成绩',简单来说就是如果传入了参数,那么查询结果就要符合,但是我现在直接用if else语句发现太麻烦了,这里三个条件需要2^3 = 8个if else分支语句,如果条件更多的话就是成指数增长了,有没有什么好一点的解决放啊可以解决这个问题啊

大家都知道使用存储过程的好处其中有2点

一个简单的存储过程:

当点击查询后兼容所有条件

1、参数查询安全(用参数就安全?)

Create procedure [dbo].[Proc_SeachJob] 
(@startRecordIndex int,
@endRecordIndex int,
@seach nvarchar(10),
@docount bit)
as
set nocount on
if(@docount=1)
--只需要把%与搜索的字符串用拼接的方式即可
select count(*) from Job where name like '%@seach%' or work_address like '%@seach%'
else
begin
declare @indextable table(id int identity(1,1),nid int)
set rowcount @endRecordIndex
insert into @indextable(nid) select ID from Job  where name like '%@seach%' or work_address like '%@seach%' order by CreateTime desc
select * from Job O,@indextable t where O.ID=t.nid
and t.id between @startRecordIndex and @endRecordIndex order by t.id
end
set nocount off

图片 2

2、存储过程在创建时预编译,执行效率比SQL语句要高

 

在进行多条件查询时可以

 

CREATE PROC Getcourse

基于这两点,看看下面这段以前经常写的存储过程吧(查询数据)

@Condition

CREATE PROCEDURE [dbo].[usp_TestExec]
    @Account VARCHAR(50)='',
    @UserName VARCHAR(50)=''
AS
BEGIN
    DECLARE @SQL VARCHAR(8000)
    SET @SQL='SELECT * FROM dbo.tb_Test WHERE 1=1';
    IF(ISNULL(@Account,'')<>'') SET @SQL=@SQL+' AND Account LIKE ''%'+@Account+'%'''
    IF(ISNULL(@UserName,'')<>'') SET @SQL=@SQL+' AND UserName LIKE ''%'+@UserName+'%'''

    EXEC(@SQL)

END    

AS

运行,测试没问题。

SELECT * FROM course

可是有谁会考虑到注入?

WHERE (c# LIKE'%'+@Condition+'%' OR cname LIKE'%'+@Condition+'%' OR t# LIKE'%'+@Condition+'%')

看着存储过程我觉得有两个问题

本文由澳门威尼斯人平台发布于澳门威尼斯人注册网站,转载请注明出处:关于存储过程可空条件查询

关键词: