首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

困住了的一路T-SQL 语句,欢迎各界高手来飘过留答

2012-12-23 
困住了的一道T-SQL 语句,欢迎各界高手来飘过留答!create proc Orders@ship varchar(100),@company varchar

困住了的一道T-SQL 语句,欢迎各界高手来飘过留答!
create proc Orders
  @ship varchar(100),
  @company varchar(100),
  @trade varchar(100), 
  @starttime datetime ,
  @endtime datetime
as
 
  (???????)

go
 (这个表的查询是:select *  from  All_Orders)

  @ship 、 @company 、@trade 、 @starttime 、  @endtime 
  这五个变量是传递过来的  查询条件
  5个查询条件 是交互的, 也就是说 不知道用户传递过来的是哪个条件,
  怎么来进行查询呢?

   请求 各路漂浮的同事们~

  
[最优解释]
试试:
if @starttime is null
  select *  from  All_orders where ship=isnull(@ship,ship)
  and company=isnull(@company,company) and trade=isnull(@trade,trade)
 if @starttime is null
  select *  from  All_orders where ship=isnull(@ship,ship)
  and company=isnull(@company,company) and trade=isnull(@trade,trade) and orders_datetime
  between  @starttime and @endtime

看上去没啥问题啊
[其他解释]
create proc Orders
   @ship varchar(100)=null,
   @company varchar(100)=null,
   @trade varchar(100)=null, 
   @starttime datetime =null,
   @endtime datetime=null
 as
  
 select *  from  All_Orders where ship=isnull(@ship,ship) and company=isnull(@company,company) and trade=isnull(@trade,trade) and starttime=isnull( @starttime,starttime)and endtime=isnull(  @endtime ,endtime)
 
 go
[其他解释]
以前经常有if判断然后动态拼接的。
现在发哥这种就可以了,用isnull判断一下,为null的就不用处理了。
当然这样的话,如果没有传这个条件,而数据中又是null值的数据是取不出来的。
[其他解释]

引用:
create proc Orders
   @ship varchar(100)=null,
   @company varchar(100)=null,
   @trade varchar(100)=null, 
   @starttime datetime =null,
   @endtime datetime=null
 as
  
 select ……


 这里面的@starttime 、@endtime  应该是 orders_datetime  between @starttime and @endtime
查询两个时间段时间的数据 

 请问 应该怎么来写呢?
[其他解释]
就性能来说,用if拼接后用 sp_executesql 将可重用计划缓冲,而且计划的选择也较好
[其他解释]
我的写法有一定的限制,但是想了一下那5个if/else有点变态......而且这个也是我以前做开发时候用过的,当然记住,有适用场合,不是说通用。
[其他解释]
引用:
我的写法有一定的限制,但是想了一下那5个if/else有点变态......而且这个也是我以前做开发时候用过的,当然记住,有适用场合,不是说通用。

现在还用不?
[其他解释]
现在不做开发了。。。。
------其他解决方案--------------------


这种如果要用if拼接的话 是15个if。。。。不是5个。这是个交互查询方式。


发哥  请解答一下刚才的问题~~


 这里面的@starttime 、@endtime  应该是 orders_datetime  between @starttime and @endtime
查询两个时间段时间的数据
[其他解释]
那要先知道你的业务,如果不传你默认如何解决?我假设一下,如果都不穿,那么默认starttime为1900-01-01,endtime为表里最大的orders_datetime,如果这样的话,那isnull(starttime,'1900-01-01') and isnull(@endtime,@maxtime)

这里@maxtime是内部变量,定义以后获取表中最大的orders_datetime

仅供参考
[其他解释]
发哥 您说的  我试验了一下  我明白了。  以后做别的开发肯定用的上,我学习了。在这里谢谢了~发哥~

但是 我这里面的业务要求是这样的。

  @ship varchar(100),
  @company varchar(100),
  @trade varchar(100), 
  @starttime datetime ,(如果@starttime有传入的话,@endtime 肯定也会有传入。因为这是两个时间段传入的参数  用sql里的between )

  相当于需要有4个查询条件,而且这4个查询条件是任意交互的,不能确定哪一个为空,有可能是ship 和company ,也有可能是ship 和 company 和 starttime 等等方式,所以上面我说如果用if来拼接的话 是15个if。

  如果是这种情况 必须要用15个if连接吗? ~  苦恼了很长时间。虽然我现在用的是15个连接拼法,但是保不准以后用5个条件 甚至更多,如果用if连接的话 那可就连多啦·····发哥。。求助啊
[其他解释]
那你其实可以仅仅考虑是否有日期,这样只需要一次if/else
[其他解释]
哦?
if @starttime =''
 select *  from  All_orders where ship=isnull(@ship,ship)
 and company=isnull(@company,company) and trade=isnull(@trade,trade)
if @starttime !=''
 select *  from  All_orders where ship=isnull(@ship,ship)
 and company=isnull(@company,company) and trade=isnull(@trade,trade) and orders_datetime
 between  @starttime and @endtime

这样嘛

[其他解释]
这样达不到那种要求啊。执行结果和15个if 拼接 出来的结果不一样。
[其他解释]
可算是弄出来 ,是以前的一个同学给我方法(ship=@ship or @ship is null or @ship ='')
这种方法。。非常感谢发哥的思路~~~~ 结贴~

热点排行