日期:2014-05-17  浏览次数:20613 次

困住了的一道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有点变态......而且这个也是我以前做开发时候用过的,当然记住,有适用场合,不是说通用。

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