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

如何优化下面的存储过程呀,三千多条数据要运行半个小时,帮帮忙吧
ALTER PROCEDURE [dbo].[Report_PPurchaseContract1]
@orgNoIn varchar(20),
@PODocNoIn varchar(20),
@SupplierIn varchar(20),
@ArrivedTimeBeginIn datetime,
@ArrivedTimeEndIn datetime,
@BusinessDateBeginIn datetime,
@BusinessDateEndIn datetime,
@ZjIn varchar(20)
AS
BEGIN

if(@OrgNoIn is null and @PODocNoIn is null and @SupplierIn is null and @ArrivedTimeBeginIn is null and @ArrivedTimeEndIn is null and @BusinessDateBeginIn is null and @BusinessDateEndIn is null and @ZjIn is null)
begin
select null as Org,null as OrgName,null as DocNo,null as Supplier_Supplier,null as SupplierName,0 as CRApplyOCMoney_TotalMoney,0 as TotalMnyAC,0 as RcvMnyAC,0 as RcvMnyAC_NonTax,0 as RcvMnyAC_Tax,
0 as APOCMoney_TotalMoney,0 as APOCMoney_NonTax,0 as APOCMoney_Tax,null as DescFlexSegments_PubDescSeg1,null as ZjName,null as shipmentdate,null as BusinessDate
return
end

DECLARE @SQL nvarchar(1000)

create table #POIDN
(
ID nvarchar(20),
Org nvarchar(20),
DocNo nvarchar(20),
Supplier_Supplier nvarchar(20),
shipmentdate datetime,
BusinessDate datetime,
DescFlexSegments_PubDescSeg1 nvarchar(20)
)

--采购订单行
create table #POLine
(
ID nvarchar(20),
PurchaseOrder nvarchar(20)
)

--采购收货单行
create table #PM_RcvLine
(
ID nvarchar(20),
Receivement nvarchar(20)
)

set @SQL='select * from (SELECT A.ID, A.Org,A.DocNo, A.Supplier_Supplier, (select top 1 C.NeedPODate from PM_POShipLine as C  left join PM_POLine as B on C.POLine=B.ID where B.PurchaseOrder=A.ID ) as NeedPODate,A.BusinessDate,(select top 1 DescFlexSegments_PubDescSeg1 from PM_POLine where PurchaseOrder=A.ID) as DescFlexSegments_PubDescSeg1 FROM PM_PurchaseOrder as A) as M where 1=1'

--根据参数筛选采购合同
if(@ArrivedTimeBeginIn<>'' and @ArrivedTimeEndIn<>'')
begin
set @SQL=@SQL+' and M.NeedPODate BETWEEN '''+convert(nvarchar(25),@ArrivedTimeBeginIn,120)+''' and '''+convert(nvarchar(25),@ArrivedTimeEndIn,120)+''''
end
if (@BusinessDateBeginIn<>'' and @BusinessDateEndIn<>'')
begin
set @SQL=@SQL+' and M.BusinessDate BETWEEN '''+convert(nvarchar(25),@BusinessDateBeginIn,120)+''' and '''+convert(nvarchar(25),@BusinessDateEndIn,120)+''''
end
if(@ZjIn<>'')
begin
set @SQL=@SQL+' and M.DescFlexSegments_PubDescSeg1='''+@ZjIn+''''
end
if (@PODocNoIn<>'')
begin
set @SQL=@SQL+' and M.DocNo like ''%'+@PODocNoIn+'%'''
end
if(@SupplierIn<>'')
begin
set @SQL=@SQL+' and M.Supplier_Supplier='''+@SupplierIn+''''
end
if (@orgNoIn<>'')
begin
set @SQL=@SQL+' and M.Org='''+@orgNoIn+''''
end

--添加索引列
ALTER table #POIDN add row int identity