日期:2014-05-16  浏览次数:20424 次

存储过程里,已经声明了变量,但是用的时候就报错


create procedure KeyWordFind
@condition varchar(2000),--查找条件
@time1 varchar(12),--时间一
@time2 varchar(12)--时间2
as 
begin

select sptm,sum(shul)as xs_shul,sum(xfje)as xs_zje from (select xsckmx.sptm,xsckmx.shul,xsckmx.xfje,keytable.keyword from SJZL_ERP_MD_XSCKMX as xsckmx,SJZL_ERP_MD_XSCKD as xsckd,(@condition) as keyTable where xsckmx.sptm=keyTable.sptm and xsckd.cancelcode!=1 and xsckmx.danh=xsckd.danh and (convert(varchar(10),xsckd.kdsj,120) between ''+@time1+'' and ''+@time2+''))as xs_heji group by sptm

end



错误的提示是:消息 1087,级别 15,状态 2,过程 KeyWordFind,第 8 行
必须声明表变量 "@condition"。


@condition为什么会报错啊?求指导,怎么解决?
------解决方案--------------------
试试这样
create procedure KeyWordFind
@condition varchar(2000),--查找条件
@time1 varchar(12),--时间一
@time2 varchar(12)--时间2
as 
begin
 DECLARE @sql VARCHAR(max)
 SET @sql='select sptm,sum(shul)as xs_shul,sum(xfje)as xs_zje from (select xsckmx.sptm,xsckmx.shul,xsckmx.xfje,keytable.keyword from SJZL_ERP_MD_XSCKMX as xsckmx,SJZL_ERP_MD_XSCKD as xsckd,('+@condition+') as keyTable where xsckmx.sptm=keyTable.sptm and xsckd.cancelcode!=1 and xsckmx.danh=xsckd.danh and (convert(varchar(10),xsckd.kdsj,120) between '''+@time1+''' and '''+@time2+'''))as xs_heji group by sptm'
 exec (@sql)
end

------解决方案--------------------
表名或者变量名为变量的时候 需要用动态SQL
------解决方案--------------------
相对而言会消耗比较大,不过有时候是因为你的确需要这些数据
------解决方案--------------------
你的过程中@condition是在参数中定义的,类型为字符串,但是你下面的查询是把@condition当表来查了,所以就会报错。而且错误信息也很明显
------解决方案--------------------
先确保你的写法能得到正确的数据,然后再考虑性能问题,如果你现在已经得到正确数据了,ctrl+m,然后执行你的代码,把执行计划贴出来
------解决方案--------------------
你的表普遍缺少索引,对19楼的第二个图中表扫描的那几个图标,你把鼠标移过去,然后看看【谓词】和【output list】那两列中用到什么列,把这些截图来看看,再决定加什么索引,加多少索引
------解决方案--------------------
CREATE CLUSTERED INDEX Clu_IX_SJZL_ERP_CKXX ON SJZL_ERP_CKXX(szqybm);
CREATE  INDEX IX_SJZL_ERP_CKXX ON SJZL_ERP_CKXX(ckbm);
CREATE  INDEX IX_SJZL_ERP_MD_SPFCKC ON SJZL_ERP_MD_SPFCKC(SPTM) INCLUDE (CKBM,SHUL);
CREATE  INDEX IX_SJZL_ERP_KEYWORD ON SJZL_ERP_KEYWORD(SPTM);

先试试加上这几个索引,最后一个图,存在隐式转换,看看能不能预先把数据转换成int,不然的话加了索引也没用
------解决方案--------------------
再贴最新的执行计划来看看,就是20秒那个