我有一个超过 300,000 行的存储过程,这是我第一次处理这种大小的东西。这是我正在编写的代码示例:
IF (@type = 'commande client')
AND @etat = 'ouvert'
BEGIN
IF (@tiersd = '')
AND @tiersf = ''
BEGIN
IF (@familled = '')
AND @famillef = ''
BEGIN
IF (@commerciald = '')
AND @commercialf = ''
BEGIN
IF (@articled = '')
AND @articlef = ''
BEGIN
IF (@afamilled = '')
AND @afamillef = ''
BEGIN
SELECT ordr.docentry,
OITM.itemCode,
rdr1.dscription,
rdr1.quantity,
rdr1.price,
rdr1.currency,
rdr1.slpCode,
rdr1.basedocnum,
rdr1.shiptocode,
rdr1.shiptodesc,
rdr1.baseprice,
ordr.docnum,
ordr.doctype,
ordr.docstatus,
ordr.docTotal,
ordr.docdate,
ordr.cardcode,
ordr.cardname,
ordr.address,
ordr.doccur,
ordr.paidtodate,
ordr.doctime,
ordr.docsubtype,
ordr.basetype,
ordr.baseEntry,
OITM.itemclass,
OITM.itemtype,
OITM.itemname,
OITM.itmsgrpcod
FROM ordr
INNER JOIN rdr1 ON ordr.docentry = rdr1.docentry
INNER JOIN oitm ON OITM.itemcode = rdr1.ItemCode
WHERE ordr.DocDate BETWEEN @dated AND @datef
AND DocStatus = 'o';
END;
ELSE IF (@afamilled != '')
AND @afamillef = ''
BEGIN
SELECT ordr.docentry,
OITM.itemCode,
rdr1.dscription,
rdr1.quantity,
rdr1.price,
rdr1.currency,
rdr1.slpCode,
rdr1.basedocnum,
rdr1.shiptocode,
rdr1.shiptodesc,
rdr1.baseprice,
ordr.docnum,
ordr.doctype,
ordr.docstatus,
ordr.docTotal,
ordr.docdate,
ordr.cardcode,
ordr.cardname,
ordr.address,
ordr.doccur,
ordr.paidtodate,
ordr.doctime,
ordr.docsubtype,
ordr.basetype,
ordr.baseEntry,
OITM.itemclass,
OITM.itemtype,
OITM.itemname,
OITM.itmsgrpcod
FROM ordr
INNER JOIN rdr1 ON ordr.docentry = rdr1.docentry
INNER JOIN oitm ON OITM.itemcode = rdr1.ItemCode
WHERE OITM.itmsgrpcod BETWEEN @afamilled AND ((SELECT MAX(itmsgrpcod)FROM oitm))
AND ordr.DocDate BETWEEN @dated AND @datef
AND DocStatus = 'o';
END;
ELSE IF (@afamilled = '')
AND @afamillef != ''
BEGIN
SELECT ordr.docentry,
OITM.itemCode,
rdr1.dscription,
rdr1.quantity,
rdr1.price,
rdr1.currency,
rdr1.slpCode,
rdr1.basedocnum,
rdr1.shiptocode,
rdr1.shiptodesc,
rdr1.baseprice,
ordr.docnum,
ordr.doctype,
ordr.docstatus,
ordr.docTotal,
ordr.docdate,
ordr.cardcode,
ordr.cardname,
ordr.address,
ordr.doccur,
ordr.paidtodate,
ordr.doctime,
ordr.docsubtype,
ordr.basetype,
ordr.baseEntry,
OITM.itemclass,
OITM.itemtype,
OITM.itemname,
OITM.itmsgrpcod
FROM ordr
INNER JOIN rdr1 ON ordr.docentry = rdr1.docentry
INNER JOIN oitm ON OITM.itemcode = rdr1.ItemCode
WHERE OITM.itmsgrpcod BETWEEN ((SELECT MIN(itmsgrpcod)FROM oitm)) AND @afamillef
AND ordr.DocDate BETWEEN @dated AND @datef
AND DocStatus = 'o';
END;
IF (@afamilled != '')
AND @afamillef != ''
BEGIN
SELECT ordr.docentry,
OITM.itemCode,
rdr1.dscription,
rdr1.quantity,
rdr1.price,
rdr1.currency,
rdr1.slpCode,
rdr1.basedocnum,
rdr1.shiptocode,
rdr1.shiptodesc,
rdr1.baseprice,
ordr.docnum,
ordr.doctype,
ordr.docstatus,
ordr.docTotal,
ordr.docdate,
ordr.cardcode,
ordr.cardname,
ordr.address,
ordr.doccur,
ordr.paidtodate,
ordr.doctime,
ordr.docsubtype,
ordr.basetype,
ordr.baseEntry,
OITM.itemclass,
OITM.itemtype,
OITM.itemname,
OITM.itmsgrpcod
FROM ordr
INNER JOIN rdr1 ON ordr.docentry = rdr1.docentry
INNER JOIN oitm ON OITM.itemcode = rdr1.ItemCode
WHERE OITM.itmsgrpcod BETWEEN @afamilled AND @afamillef
AND ordr.DocDate BETWEEN @dated AND @datef
AND DocStatus = 'o';
END;
END;
----------------------------
ELSE IF (@articled != '')
AND @articlef != ''
BEGIN
IF (@afamilled = '')
AND @afamillef = ''
BEGIN
SELECT ordr.docentry,
OITM.itemCode,
rdr1.dscription,
rdr1.quantity,
rdr1.price,
rdr1.currency,
rdr1.slpCode,
rdr1.basedocnum,
rdr1.shiptocode,
rdr1.shiptodesc,
rdr1.baseprice,
ordr.docnum,
ordr.doctype,
ordr.docstatus,
ordr.docTotal,
ordr.docdate,
ordr.cardcode,
ordr.cardname,
ordr.address,
ordr.doccur,
ordr.paidtodate,
ordr.doctime,
ordr.docsubtype,
ordr.basetype,
ordr.baseEntry,
OITM.itemclass,
OITM.itemtype,
OITM.itemname,
OITM.itmsgrpcod
FROM ordr
INNER JOIN rdr1 ON ordr.docentry = rdr1.docentry
INNER JOIN oitm ON OITM.itemcode = rdr1.ItemCode
WHERE OITM.itemcode BETWEEN @articled AND @articlef
AND ordr.DocDate BETWEEN @dated AND @datef
AND DocStatus = 'o';
END;
IF (@afamilled != '')
AND @afamillef = ''
BEGIN
SELECT ordr.docentry,
OITM.itemCode,
rdr1.dscription,
rdr1.quantity,
rdr1.price,
rdr1.currency,
rdr1.slpCode,
rdr1.basedocnum,
rdr1.shiptocode,
rdr1.shiptodesc,
rdr1.baseprice,
ordr.docnum,
ordr.doctype,
ordr.docstatus,
ordr.docTotal,
ordr.docdate,
ordr.cardcode,
ordr.cardname,
ordr.address,
ordr.doccur,
ordr.paidtodate,
ordr.doctime,
ordr.docsubtype,
ordr.basetype,
ordr.baseEntry,
OITM.itemclass,
OITM.itemtype,
OITM.itemname,
OITM.itmsgrpcod
FROM ordr
INNER JOIN rdr1 ON ordr.docentry = rdr1.docentry
INNER JOIN oitm ON OITM.itemcode = rdr1.ItemCode
WHERE OITM.itemcode BETWEEN @articled AND @articlef
AND OITM.itmsgrpcod BETWEEN @afamilled AND ((SELECT MAX(itmsgrpcod)FROM oitm))
AND ordr.DocDate BETWEEN @dated AND @datef
AND DocStatus = 'o';
END;
IF (@afamilled = '')
AND @afamillef != ''
BEGIN
SELECT ordr.docentry,
OITM.itemCode,
rdr1.dscription,
rdr1.quantity,
rdr1.price,
rdr1.currency,
rdr1.slpCode,
rdr1.basedocnum,
rdr1.shiptocode,
rdr1.shiptodesc,
rdr1.baseprice,
ordr.docnum,
ordr.doctype,
ordr.docstatus,
ordr.docTotal,
ordr.docdate,
ordr.cardcode,
ordr.cardname,
ordr.address,
ordr.doccur,
ordr.paidtodate,
ordr.doctime,
ordr.docsubtype,
ordr.basetype,
ordr.baseEntry,
OITM.itemclass,
OITM.itemtype,
OITM.itemname,
OITM.itmsgrpcod
FROM ordr
INNER JOIN rdr1 ON ordr.docentry = rdr1.docentry
INNER JOIN oitm ON OITM.itemcode = rdr1.ItemCode
WHERE OITM.itemcode BETWEEN @articled AND @articlef
AND OITM.itmsgrpcod BETWEEN ((SELECT MIN(itmsgrpcod)FROM oitm)) AND @afamillef
AND ordr.DocDate BETWEEN @dated AND @datef
AND DocStatus = 'o';
END;
IF (@afamilled != '')
AND @afamillef != ''
BEGIN
SELECT ordr.docentry,
OITM.itemCode,
rdr1.dscription,
rdr1.quantity,
rdr1.price,
rdr1.currency,
rdr1.slpCode,
rdr1.basedocnum,
rdr1.shiptocode,
rdr1.shiptodesc,
rdr1.baseprice,
ordr.docnum,
ordr.doctype,
ordr.docstatus,
ordr.docTotal,
ordr.docdate,
ordr.cardcode,
ordr.cardname,
ordr.address,
ordr.doccur,
ordr.paidtodate,
ordr.doctime,
ordr.docsubtype,
ordr.basetype,
ordr.baseEntry,
OITM.itemclass,
OITM.itemtype,
OITM.itemname,
OITM.itmsgrpcod
FROM ordr
INNER JOIN rdr1 ON ordr.docentry = rdr1.docentry
INNER JOIN oitm ON OITM.itemcode = rdr1.ItemCode
WHERE OITM.itemcode BETWEEN @articled AND @articlef
AND OITM.itmsgrpcod BETWEEN @afamilled AND @afamillef
AND ordr.DocDate BETWEEN @dated AND @datef
AND DocStatus = 'o';
END;
END;
问题是即使条件不满足,编译器似乎也会检查每个 if 语句,这需要大约半小时,所以我希望找到解决这个问题的方法