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

sql2005
select d.drivername,
(select mpCount from dbo.GetDriverMileage(d.id,'','')) as a ,    
(select kmSum from dbo.GetDriverMileage(d.id,'','')) as b ,c.carnum,ad.initdate 
from dbo.t_b_Driver d 
right join dbo.t_e_AvailableDriver ad on ad.DriverID=d.ID 
left join dbo.t_e_AvailableCar ac on ad.usecarid=ac.id 
left join dbo.t_b_Car c on c.id=ac.carid 
where 1=1 group by d.drivername,c.carnum,ad.initdate 


消息 8624,级别 16,状态 17,第 1 行
内部查询处理器错误: 查询处理器无法生成查询计划。有关详细信息,请与客户支持服务部门联系。

以上 我是这个查询又调用的一个表值函数 结果就出现这个错误了。
我单执行一条查询
select * from dbo.GetDriverMileage(1,'','') 这个函数式正常的。 
求哪位大侠 会啊。
sql join ?.net?

------解决方案--------------------
引用:
引用:
大神们都放假呢~错误是无法为语句生成查询计划,但是错误原因不会分析,太复杂呵呵
你的GetDriverMileage这个表值函数这里做为标量函数使用呢,如果直接改成标量函数呢?

我刚开始是写的是标量函数 不过 我想返回的是两个值 就写成表值函数了 
主要是 语句是一样的 只是查询的字段不一样  
不过 这个问题解决了 只要去掉最后的group b……

虽然写成表值,你还是执行了两次.2K5以上可以用CROSS APPLY
------解决方案--------------------
调用函数将承担每行数据都要进行函数运算,当非常复杂的时候可能会导致执行计划无法生成,这个情况下改写是最好的方法,可以考虑7楼的CROSS APPLY