| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 347 人关注过本帖
标题:请教SQLSERVER条件查询的问题
只看楼主 加入收藏
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:694
专家分:20
注 册:2014-1-16
结帖率:88.52%
收藏
已结贴  问题点数:20 回复次数:11 
请教SQLSERVER条件查询的问题
一个条件查询语句放在SQLSERVER的带参数的存储过程里面,VFP客户端输入参数值,查询出结果,但是假如某个条件没有输入条件,那么在SQLSERVER端,就没有这个查询条件,那在SQL端就要判断参数是否是空值,空值和不是空值查询语句就不一样,请问这种查询在SQLSERVER存储过程中,应该怎么写?假如数据在VFP端好写,SQL就不会了,恳请帮忙解决
搜索更多相关主题的帖子: SQLSERVER 空值 参数 查询 条件 
2024-06-19 11:03
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:694
专家分:20
注 册:2014-1-16
收藏
得分:0 
我的意思是当客户端没有输入某个条件的值,服务器端的查询语句就不能有这个查询条件,而不是把参数当成空值条件来查询
2024-06-19 11:15
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:232
专家分:1746
注 册:2023-6-29
收藏
得分:10 
程序代码:
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编辑过]

2024-06-19 11:25
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:694
专家分:20
注 册:2014-1-16
收藏
得分:0 
或者这么说,如果条件为空就查询全部
2024-06-19 11:37
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:10 
以存储过程 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%'''
注:存储过程中,若单引号中的字符串包含一个嵌入的引号,可使用两个连续的单引号来表示嵌入的单引号

泉城飞狐
2024-06-19 13:43
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
以上处理方法有 4 个关键点:
1、在存储过程的定义中,需为形参指定默认值,如:@tcFor varchar(100)=NULL,即:为参数 @tcFor 指定了默认值 NULL,否则,在省略参数调用过程时会报错
2、必须将存储过程中的 @cSQL 定义为 nvarchar,不能是 varchar
3、使用系统存储过程 sp_executesql 来执行一个 SQL 字符串语句
4、在调用过程中,若条件中有单引号,需用两个连续的单引号来表示一个嵌入的单引号

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


泉城飞狐
2024-06-19 13:52
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:694
专家分:20
注 册:2014-1-16
收藏
得分:0 
谢谢各位的解答,yiyanxiyin版主的解答我没有怎么弄懂,liuxingang28的解答很明了,但是有个问题,我的条件查询可能不止一个条件,也许有5个条件或者更多,用这样的方法会不会有很多的判断啊
2024-06-19 14:12
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
回复 7楼 fanjinyu9108
肯定要有很多判断,对于每一个查询参数均需判断省略后如何处理

泉城飞狐
2024-06-19 14:20
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:232
专家分:1746
注 册:2023-6-29
收藏
得分:0 
如果采用动态语句, 可以将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编辑过]

2024-06-19 14:47
fanjinyu9108
Rank: 2
等 级:论坛游民
帖 子:694
专家分:20
注 册:2014-1-16
收藏
得分:0 
非常感谢yiyanxiyin版主的解答,测试通过,但还是有一点不懂,'@a int =null'这个参数后面 =null是什么意思?表示默认值是NULL吗
2024-06-19 17:46
快速回复:请教SQLSERVER条件查询的问题
数据加载中...
 
   



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

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