注册 登录
编程论坛 VFP论坛

请教SQLSERVER条件查询的问题

fanjinyu9108 发布于 2024-06-19 11:03, 351 次点击
一个条件查询语句放在SQLSERVER的带参数的存储过程里面,VFP客户端输入参数值,查询出结果,但是假如某个条件没有输入条件,那么在SQLSERVER端,就没有这个查询条件,那在SQL端就要判断参数是否是空值,空值和不是空值查询语句就不一样,请问这种查询在SQLSERVER存储过程中,应该怎么写?假如数据在VFP端好写,SQL就不会了,恳请帮忙解决
11 回复
#2
fanjinyu91082024-06-19 11:15
我的意思是当客户端没有输入某个条件的值,服务器端的查询语句就不能有这个查询条件,而不是把参数当成空值条件来查询
#3
yiyanxiyin2024-06-19 11:25
程序代码:
alter proc   t1(@i int =null )
as
begin

if (@i is null)  
begin
    print 1
end
else begin
    print 2
end

 

end

go
exec t1
go
exec t1 1


2楼要求:
程序代码:

alter proc   t1(@a int =null, @b varchar(10) =null)
as
begin

select * from (select 1 a, 'a' b  union all select 2 a, 'b' b   union all select 3 a, 'c' b  ) t
where (@a is null or @a =a ) and (@b is null or @b = b)

end

go
exec t1 1
go
exec t1

go
exec t1 null, 'b'






[此贴子已经被作者于2024-6-19 11:31编辑过]

#4
fanjinyu91082024-06-19 11:37
或者这么说,如果条件为空就查询全部
#5
liuxingang282024-06-19 13:43
以存储过程 a_test 为例,其代码如下:
ALTER PROCEDURE [dbo].[a_test]
    @tcFor varchar(100)=NULL
AS
BEGIN
    SET NOCOUNT ON;
    declare @cSql nvarchar(200)
    if isnull(@tcFor,'')=''
        set @cSql = 'select * from erp_module'
    else
        set @cSql = 'select * from erp_module where '+@tcFor
    exec sp_executesql @cSql
END

调用:
示例1:省略参数时,查询表 erp_module 的所有记录
exec a_test

示例2:查询表 erp_module 中满足筛选条件的记录(module字段中以 po 开头的记录)
exec a_test 'module like ''po%'''
注:存储过程中,若单引号中的字符串包含一个嵌入的引号,可使用两个连续的单引号来表示嵌入的单引号
#6
liuxingang282024-06-19 13:52
以上处理方法有 4 个关键点:
1、在存储过程的定义中,需为形参指定默认值,如:@tcFor varchar(100)=NULL,即:为参数 @tcFor 指定了默认值 NULL,否则,在省略参数调用过程时会报错
2、必须将存储过程中的 @cSQL 定义为 nvarchar,不能是 varchar
3、使用系统存储过程 sp_executesql 来执行一个 SQL 字符串语句
4、在调用过程中,若条件中有单引号,需用两个连续的单引号来表示一个嵌入的单引号

[此贴子已经被作者于2024-6-19 13:54编辑过]

#7
fanjinyu91082024-06-19 14:12
谢谢各位的解答,yiyanxiyin版主的解答我没有怎么弄懂,liuxingang28的解答很明了,但是有个问题,我的条件查询可能不止一个条件,也许有5个条件或者更多,用这样的方法会不会有很多的判断啊
#8
liuxingang282024-06-19 14:20
回复 7楼 fanjinyu9108
肯定要有很多判断,对于每一个查询参数均需判断省略后如何处理
#9
yiyanxiyin2024-06-19 14:47
如果采用动态语句, 可以将where条件交给用户来拼接, 但这种写法有sql注入的风险, 需要考虑安全性, 封装性也不是很好,把很多处理抛给了最终用户, 不是很负责任的写法, 但也能敷衍
程序代码:

ALTER PROCEDURE [dbo].[a_test]
   @sqlCondition varchar(max)=null
AS
BEGIN
    declare @cSql varchar(max)
    set @cSql = 'select * from tableName where '+ isnull(@sqlCondition , '1=1')
    exec sp_executesql @cSql
END

还是建议使用我的方法
解释一下: (@a is null or @a =a ), 当@a为null, or后面的条件不会执行
 (@a is null or @a =a ) and (@b is null or @b = b)  这里的and表示a,b字段同时满足条件才会查询出来  , 如果你的业务要求是只要满足其中一个条件就显示, 那么可以把and 改成or
我这里是2个条件的例子, 当你有5个条件时使用相同的方式扩展即可 , 不需要任何判断



[此贴子已经被作者于2024-6-19 14:50编辑过]

#10
fanjinyu91082024-06-19 17:46
非常感谢yiyanxiyin版主的解答,测试通过,但还是有一点不懂,'@a int =null'这个参数后面 =null是什么意思?表示默认值是NULL吗
#11
yiyanxiyin2024-06-19 18:09
是的
#12
ipoint2024-06-21 15:49
Find Womans from your town for night
[URL=https://meettomy.site]Girls from your city[/URL]
1