sql多条件查询的存储过程中日期传参的问题

到处都要注册额 2014-07-21 01:30:10

/**
exec sp_queryByPage 2,1,'','',''
exec sp_queryByPage 2,1,null,'',''
*/
use Goods
if exists(select name from sysobjects
where name='sp_queryByPage' and type='P')
DROP procedure sp_queryByPage
go
create procedure sp_queryByPage
(@pageSize int,
@nowPage int,
@orderDay datetime =null,
@supplierID varchar(50),
@orderID varchar(50)
)
as
declare @rowBegin as int
select @rowBegin=(@nowPage-1)*@pageSize
declare @sql varchar(4000)
set @sql='
select top $pageSize *
from dbo.tb_order
where orderDay=isnull(''$orderDay'',orderDay)
and supplierID=CASE ''$supplierID'' WHEN '''' THEN supplierID ELSE ''$supplierID'' END
and orderID=CASE ''$orderID'' WHEN '''' THEN supplierID ELSE ''$orderID'' END
and orderID
not in(
select top $rowBegin orderID
from tb_order
where orderDay=isnull(''$orderDay'',orderDay)
and supplierID=CASE ''$supplierID'' WHEN '''' THEN supplierID ELSE ''$supplierID'' END
and orderID=CASE ''$orderID'' WHEN '''' THEN supplierID ELSE ''$orderID'' END
)
'
set @sql=replace(@sql,'$pageSize',@pageSize)
set @sql=replace(@sql,'$rowBegin',@rowBegin)
set @sql=replace(@sql,'$orderDay',@orderDay)
set @sql=replace(@sql,'$supplierID',@supplierID)
set @sql=replace(@sql,'$orderID',@orderID)
exec (@sql)
print(@sql)


exec sp_queryByPage 2,1,null,'','' 为嘛这样的话没有结果,也不打印 该怎么传null啊
exec sp_queryByPage 2,1,'','','' 为嘛传的空值却显示orderDay=isnull('01 1 1900 12:00AM',orderDay)这个时间,那这个地方该怎么判断呢,这是多条件查询的存储过程,不知道大家都是什么写的
...全文
372 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 7 楼 shinger126 的回复:
引用 5 楼 woyuditan26 的回复:
[quote=引用 1 楼 DBA_Huangzj 的回复:] print不了是因为里面有错误
null不能直接这样传吗
select REPLACE('abc','b',null),你看下返回结果就明白了。这里会直接返回null值,也就是说你的动态语句整个变成了null,当然就不会执行任何操作啦[/quote]thank u
  • 打赏
  • 举报
回复
引用 10 楼 Tiger_Zhao 的回复:
更正
set @sql=replace(@sql,'''$orderDay''','NULL')

IF  @orderDay IS NULL
	set @sql=replace(@sql,'$orderDay','')
	ELSE
	begin
		set @sql=replace(@sql,'$orderDay',@orderDay)
	end
借您的思想,我这样用赋值为空和判空解决了,多谢。也谢谢大家的帮助,各位辛苦了
Tiger_Zhao 2014-07-21
  • 打赏
  • 举报
回复
更正
set @sql=replace(@sql,'''$orderDay''','NULL')
  • 打赏
  • 举报
回复
引用 3 楼 chz415767975 的回复:
帮你改了下,你运行试试
  /**
    exec sp_queryByPage 2,1,'','',''
    exec sp_queryByPage 2,1,null,'','' 
 */   

if exists(select name from sysobjects 
where name='sp_queryByPage' and type='P')
DROP procedure sp_queryByPage
go
create procedure sp_queryByPage
	(@pageSize int,
	 @nowPage int,
	 @orderDay datetime ,
	 @supplierID varchar(50),
	 @orderID varchar(50)
	)
as  
begin
	declare @rowBegin as int
	select @rowBegin=(@nowPage-1)*@pageSize
	declare @sql varchar(4000)
	declare @condition varchar(50)
	set @condition=''
	if(@orderDay!=null)
	begin 
	set @condition=' and orderDay=isnull(''$orderDay'',orderDay)'
	end

	
	set @sql='
	select top $pageSize * 
	from dbo.tb_order
    where  1=1 '+@condition+'
    and supplierID=CASE ''$supplierID'' WHEN '''' THEN supplierID ELSE ''$supplierID'' END
    and orderID=CASE ''$orderID'' WHEN '''' THEN supplierID ELSE  ''$orderID'' END
	and orderID
	not in(
	   select top $rowBegin orderID
	   from tb_order
	   where orderDay=isnull(''$orderDay'',orderDay)
		and supplierID=CASE ''$supplierID'' WHEN '''' THEN supplierID ELSE ''$supplierID'' END
		and orderID=CASE ''$orderID'' WHEN '''' THEN supplierID ELSE  ''$orderID'' END
	 ) 	 
	'
	set @sql=replace(@sql,'$pageSize',@pageSize)
	set @sql=replace(@sql,'$rowBegin',@rowBegin)
	set @sql=replace(@sql,'$orderDay',@orderDay)
	set @sql=replace(@sql,'$supplierID',@supplierID)
	set @sql=replace(@sql,'$orderID',@orderID)
	--select @sql
	exec (@sql)
end
	go
	 ---exec sp_queryByPage 2,1,null,'',''  第一个不执行,因为类型不对
	  --exec sp_queryByPage 2,1,'','',''
---exec sp_queryByPage 2,1,null,'','' 第一个不执行,因为类型不对 这样传空值不行吗?这样之后在进行判null啊, 用你的试的exec sp_queryByPage 2,1,'','',''没错,但是没有结果集,我的思路就是3个条件进行检索,某个为空的时候就不用这个条件了,这样实现思路有问题吗难道??
Tiger_Zhao 2014-07-21
  • 打赏
  • 举报
回复
--set @sql=replace(@sql,'$orderDay',@orderDay)
IF @orderDay IS NULL
set @sql=replace(@sql,''$orderDay'','NULL')
ELSE
set @sql=replace(@sql,'$orderDay',@orderDay)
shinger126 2014-07-21
  • 打赏
  • 举报
回复
引用 5 楼 woyuditan26 的回复:
引用 1 楼 DBA_Huangzj 的回复:
print不了是因为里面有错误
null不能直接这样传吗
select REPLACE('abc','b',null),你看下返回结果就明白了。这里会直接返回null值,也就是说你的动态语句整个变成了null,当然就不会执行任何操作啦
飞啊子 2014-07-21
  • 打赏
  • 举报
回复
你可以这样解决: 当某个参数为null时或''时,则不要拼接这个条件..
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
print不了是因为里面有错误
null不能直接这样传吗
發糞塗牆 2014-07-21
  • 打赏
  • 举报
回复
用这个试试:
ALTER procedure sp_queryByPage
    (@pageSize int,
     @nowPage int,
     @orderDay datetime =null,
     @supplierID varchar(50),
     @orderID varchar(50)
    )
as  
    declare @rowBegin as int
    select @rowBegin=(@nowPage-1)*@pageSize
    declare @sql varchar(4000)
    set @sql='
    select top $pageSize * 
    from dbo.tb_order
    where orderDay=isnull('''+CONVERT(VARCHAR(30),@orderDay,121)+''',orderDay)
    and supplierID=CASE ''$supplierID'' WHEN '''' THEN supplierID ELSE ''$supplierID'' END
    and orderID=CASE ''$orderID'' WHEN '''' THEN supplierID ELSE  ''$orderID'' END
    and orderID
    not in(
       select top $rowBegin orderID
       from tb_order
       where orderDay=isnull('''+CONVERT(VARCHAR(30),@orderDay,121)+''',orderDay)
        and supplierID=CASE ''$supplierID'' WHEN '''' THEN supplierID ELSE ''$supplierID'' END
        and orderID=CASE ''$orderID'' WHEN '''' THEN supplierID ELSE  ''$orderID'' END
     )      
    '
    set @sql=replace(@sql,'$pageSize',@pageSize)
    set @sql=replace(@sql,'$rowBegin',@rowBegin)
    set @sql=replace(@sql,'$orderDay',@orderDay)
    set @sql=replace(@sql,'$supplierID',@supplierID)
    set @sql=replace(@sql,'$orderID',@orderID)
    --exec (@sql)
    print(@sql)

go
exec sp_queryByPage 2,1,'','',''
霜寒月冷 2014-07-21
  • 打赏
  • 举报
回复
帮你改了下,你运行试试
  /**
    exec sp_queryByPage 2,1,'','',''
    exec sp_queryByPage 2,1,null,'','' 
 */   

if exists(select name from sysobjects 
where name='sp_queryByPage' and type='P')
DROP procedure sp_queryByPage
go
create procedure sp_queryByPage
	(@pageSize int,
	 @nowPage int,
	 @orderDay datetime ,
	 @supplierID varchar(50),
	 @orderID varchar(50)
	)
as  
begin
	declare @rowBegin as int
	select @rowBegin=(@nowPage-1)*@pageSize
	declare @sql varchar(4000)
	declare @condition varchar(50)
	set @condition=''
	if(@orderDay!=null)
	begin 
	set @condition=' and orderDay=isnull(''$orderDay'',orderDay)'
	end

	
	set @sql='
	select top $pageSize * 
	from dbo.tb_order
    where  1=1 '+@condition+'
    and supplierID=CASE ''$supplierID'' WHEN '''' THEN supplierID ELSE ''$supplierID'' END
    and orderID=CASE ''$orderID'' WHEN '''' THEN supplierID ELSE  ''$orderID'' END
	and orderID
	not in(
	   select top $rowBegin orderID
	   from tb_order
	   where orderDay=isnull(''$orderDay'',orderDay)
		and supplierID=CASE ''$supplierID'' WHEN '''' THEN supplierID ELSE ''$supplierID'' END
		and orderID=CASE ''$orderID'' WHEN '''' THEN supplierID ELSE  ''$orderID'' END
	 ) 	 
	'
	set @sql=replace(@sql,'$pageSize',@pageSize)
	set @sql=replace(@sql,'$rowBegin',@rowBegin)
	set @sql=replace(@sql,'$orderDay',@orderDay)
	set @sql=replace(@sql,'$supplierID',@supplierID)
	set @sql=replace(@sql,'$orderID',@orderID)
	--select @sql
	exec (@sql)
end
	go
	 ---exec sp_queryByPage 2,1,null,'',''  第一个不执行,因为类型不对
	  --exec sp_queryByPage 2,1,'','',''
  • 打赏
  • 举报
回复
求助啊
發糞塗牆 2014-07-21
  • 打赏
  • 举报
回复
print不了是因为里面有错误

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧