当前位置: 代码迷 >> Sql Server >> 存储过程变量值的疑点
  详细解决方案

存储过程变量值的疑点

热度:8   发布时间:2016-04-24 09:51:31.0
存储过程变量值的疑问
创建了个存储过程
create proc A @start date,@end date,@unti nvarchar(20) as
declare @3 varchar(8000)
set @3='select convert(varchar(10),EndTime,120)as 日期'
select @3=@3+',sum(case MaterialCode when '''+MaterialCode+''' then ActualQuality else 0 end)['+MaterialCode+']'
from (select distinct top 100 MaterialCode from PR_Batch order by MaterialCode)a
set @3=@3+' from PR_Batch where (convert(varchar(20),EndTime,120) between '''+convert(varchar(20),@start ,120)+''' and '''+convert(varchar(20),@ende,120)+'''or ('''+convert(varchar(20),@start,120)+'''=''''and '''+convert(varchar(20),@end,120)+'''='''' )  and (unti like ''%''+'''+@unti+'''+''%'' or '''+@unti+'''=''''))'
set @3=@3+' group by convert(varchar(10),EndTime,120) order by 日期'
print(@3)
exec(@3)

存储过程能实行,但是运行后的结果不正确,就是@unti变量不管输入何值数据都一样,是哪里写错了么,print的结果
select convert(varchar(10),EndTime,120)as 日期,sum(case MaterialCode when '1#砂' then ActualQuality else 0 end)[1#砂],sum(case MaterialCode when '1#石' then ActualQuality else 0 end)[1#石 from PR_Batch where (convert(varchar(20),EndTime,120) between '2014-09-01' and '2014-09-02'or ('2014-09-01'=''and '2014-09-02'='' )  and (unti like '%'+'1#'+'%' or '1#'='')) group by convert(varchar(10),EndTime,120) order by 日期

------解决思路----------------------
select
 convert(varchar(10),EndTime,120)as 日期,
sum(case MaterialCode when '1#砂' then ActualQuality else 0 end)[1#砂],
sum(case MaterialCode when '1#石' then ActualQuality else 0 end)[1#石]
from 
PR_Batch where (convert(varchar(20),EndTime,120) between '2014-09-01' and '2014-09-02'or ('2014-09-01'=''and '2014-09-02'='' )  and (unti like '%'+'1#'+'%' or '1#'='')) 
group by
 convert(varchar(10),EndTime,120) order by 日期

把红色这一段的逻辑顺序搞清楚 应该就是这里的逻辑问题 

该加()限制顺序的时候还是要加上比较好
------解决思路----------------------
create proc A @start date,@end date,@unti nvarchar(20) as
declare @3 varchar(8000)
set @3='select convert(varchar(10),EndTime,120)as 日期'
select @3=@3+',sum(case MaterialCode when '''+MaterialCode+''' then ActualQuality else 0 end)['+MaterialCode+']'
from (select distinct top 100 MaterialCode from PR_Batch order by MaterialCode)a
set @3=@3+' from PR_Batch where (convert(varchar(20),EndTime,120) between '''+convert(varchar(20),@start ,120)+''' and '''+convert(varchar(20),@ende,120)+'''or ('''+convert(varchar(20),@start,120)+'''=''''and '''+convert(varchar(20),@end,120)+'''='''' ))  and (unti like ''%''+'''+@unti+'''+''%'' or '''+@unti+'''='''')'
set @3=@3+' group by convert(varchar(10),EndTime,120) order by 日期'
print(@3)
exec(@3)

我挪了下一个右括号的位置,你看下~~
  相关解决方案