2017-03-01 95 views
-1

我有这样的存储过程。我发布的程序体太多,参数太多,我必须对仓库活动进行很多控制。 它变得巨大,我无法控制它。优化这个最好的办法是什么?优化很长的存储过程

DECLARE @ORDERFICHEREF INT =488 
DECLARE @STFICHEREF INT =560 
DECLARE @CLIENTREF INT =608 
DECLARE @BARCODE VARCHAR(50)='1536011000010' 
DECLARE @ISPARTIAL BIT=0 
DECLARE @TERMINALREF INT=1 
DECLARE @PARAMETERREF INT=0 
DECLARE @PARTIALAMOUNT FLOAT=1 
DECLARE @PARTIALUOMREF INT=59 
DECLARE @PARTIALCONVFACT1 INT =1 
DECLARE @PARTIALCONVFACT2 INT =50 


DECLARE @RESULT INT 
DECLARE @FICHENO VARCHAR(20) 
DECLARE @STATUS SMALLINT 
DECLARE @BRANCH SMALLINT 
DECLARE @SOURCEINDEX SMALLINT 
DECLARE @BARCODEREF INT 
DECLARE @ITEMREF INT 
DECLARE @VARIANTREF INT 
DECLARE @USREF INT 
DECLARE @UOMREF INT 
DECLARE @CONVFACT1 FLOAT 
DECLARE @CONVFACT2 FLOAT 
DECLARE @LSTAMOUNT FLOAT 
DECLARE @USELABELUNITA INT 
DECLARE @CHECKTYPE INT 
DECLARE @ISEAN BIT 
DECLARE @BARCODESPECODE VARCHAR(50) 
DECLARE @PRICE FLOAT 

SET @ISEAN=0 
SET @CHECKTYPE =-1 
SET @RESULT=0 

DECLARE @SHIPINFOREF INT 

SELECT @FICHENO =ORF.FICHENO,@STATUS=ORF.[STATUS],@BRANCH=ORF.BRANCH,@SOURCEINDEX=ORF.SOURCEINDEX 
FROM ORDERFICHE ORF 
INNER JOIN ORDERFICHE_TERMINAL ORFT ON ORF.LOGICALREF=ORFT.ORDERFICHEREF 
WHERE [email protected] AND [email protected] 

IF (@STATUS IS NULL OR (@STATUS NOT IN (0,1,6))) 
BEGIN 
SET @RESULT=14 --Fişe terminal atanmış ve fiş statusu tamamlandıdan küçük olacak 
GOTO RESULT 
END 

SELECT 
@BARCODEREF=LBL.LOGICALREF, 
@ITEMREF=LBL.ITEMREF, 
@VARIANTREF=LBL.VARIANTREF, 
@UOMREF=LBL.UOMREF, 
@USREF=LBL.USREF, 
@CONVFACT1 = LBL.CONVFACT1, 
@CONVFACT2 = LBL.CONVFACT2, 
@LSTAMOUNT=SUM(CAST(CAST(STL.AMOUNT*STL.CONVFACT2/STL.CONVFACT1*(2-IOCODE)/ABS(2-IOCODE) AS NUMERIC(28,6)) AS FLOAT)), 
@BARCODESPECODE = LBL.SPECODE 
FROM LABEL_CARD LBL 
LEFT OUTER JOIN STLINE STL ON LBL.LOGICALREF=STL.BARCODEREF AND [email protected] AND [email protected] 
WHERE [email protected] 
GROUP BY LBL.LOGICALREF,LBL.ITEMREF,LBL.VARIANTREF,LBL.USREF,LBL.UOMREF,LBL.CONVFACT2,LBL.CONVFACT1,LBL.AMOUNT,STL.BRANCH,STL.SOURCEINDEX,LBL.SPECODE 

--BARKOD - CARİ,SEVKİYAT ADRES KONTROLU 
DECLARE @LABELCLINETREF INT 
DECLARE @LABELLGORFICHEREF INT 
DECLARE @LABELLGORFLINEREF INT 
DECLARE @LABELSHIPINFOREF INT 

IF(@BARCODEREF IS NOT NULL AND (SELECT CONVERT(BIT,VALUE) FROM ORDER_PARAMETER WHERE PARAMETERREF=86)=0) --Cari hesap için yazdırılmış etiket farklı cariye satılsın mı? 
BEGIN 

SELECT @SHIPINFOREF=SHIPINFOREF FROM STFICHE WHERE [email protected] 

SELECT @LABELCLINETREF=CLIENTREF,@LABELLGORFICHEREF=LGORFICHEREF,@LABELLGORFLINEREF=LGORFLINEREF,@LABELSHIPINFOREF=SHIPINFOREF 
FROM LABEL_CARD_LGREFERENCE WHERE [email protected] AND ISCANCELLED=0 

IF(@LABELCLINETREF<>@CLIENTREF) 
BEGIN 
SET @RESULT=57 -- BAŞKA CARİ İÇİN YAZDIRILMIŞ ETİKET 
GOTO RESULT 
END 

IF (ISNULL(@LABELSHIPINFOREF,0)>0) 
BEGIN 
IF(ISNULL(@LABELSHIPINFOREF,0)<>ISNULL(@SHIPINFOREF,0)) 
BEGIN 
SET @RESULT=58 -- SEVKİYAT ADRESLERİ FARKLI 
GOTO RESULT 
END 
END 
END 

IF (@BARCODEREF IS NULL) 
BEGIN 
    DECLARE @EANCHARCOUNT INT 
    SELECT @EANCHARCOUNT=ISNULL(VALUE,0) FROM ORDER_PARAMETER WHERE PARAMETERREF=60 
    IF @EANCHARCOUNT>0 
    BEGIN 
     SET @BARCODE=LEFT(@BARCODE,@EANCHARCOUNT) 
    END 

    SELECT @ITEMREF=UB.ITEMREF,@VARIANTREF=ISNULL(UB.VARIANTREF,0),@UOMREF=UB.UNITLINEREF,@USREF=ITM.UNITSETREF,@CONVFACT1 = IUA.CONVFACT1,@CONVFACT2 =IUA.CONVFACT2 
    FROM {0}..LG_{1}_UNITBARCODE UB 
    JOIN {0}..LG_{1}_ITEMS ITM ON ITM.LOGICALREF=UB.ITEMREF 
    JOIN {0}..LG_{1}_ITMUNITA IUA ON IUA.UNITLINEREF=UB.UNITLINEREF AND IUA.LOGICALREF=UB.ITMUNITAREF AND UB.VARIANTREF=IUA.VARIANTREF 
    WHERE UB.TYP IN (0,1) AND [email protected] 

    IF ISNULL(@ITEMREF,0)=0 
    BEGIN 
     SET @RESULT=1 -- @ITEMREF NULL GELİYORSA EAN BARKOD YOK --Barkod LABEL_CARD'da ya sa UNITBARCODE da olmalı 
     GOTO RESULT 
    END 

    SET @ISEAN=1 
    SELECT @CHECKTYPE=CONVERT(INT,VALUE) FROM ORDER_PARAMETER WHERE PARAMETERREF=53 
    IF(@CHECKTYPE=0) 
    BEGIN 
     SELECT @LSTAMOUNT=SUM(CAST(CAST(AMOUNT*CONVFACT2/CONVFACT1*(2-IOCODE)/ABS(2-IOCODE) AS NUMERIC(28,6)) AS FLOAT)) 
     FROM STLINE 
     WHERE [email protected] AND [email protected] AND [email protected] AND [email protected] AND BARCODEREF IS NULL 
    END 
    IF(@CHECKTYPE=1) 
    BEGIN 
     SELECT @LSTAMOUNT=SUM(CAST(CAST(AMOUNT*(2.5-IOCODE)/ABS(2.5-IOCODE)*(UINFO2/UINFO1) AS NUMERIC(28,6)) AS FLOAT)) 
     FROM {0}..LG_{1}_{2}_STLINE 
     WHERE [email protected] AND [email protected] AND [email protected] AND CANCELLED=0 AND LPRODSTAT = 0 AND UINFO1>0 AND UINFO2>0 
    END 

    IF((SELECT CONVERT(BIT,VALUE) FROM ORDER_PARAMETER WHERE PARAMETERREF=54)=1) 
    BEGIN 
     SET @PARTIALAMOUNT=1 
     SET @PARTIALUOMREF = @UOMREF 
     SET @PARTIALCONVFACT1 = @CONVFACT1 
     SET @PARTIALCONVFACT2 = @CONVFACT2 
    END 

    IF(@CHECKTYPE=1) 
    BEGIN 
     DECLARE @BACKAMOUNT FLOAT 
     SELECT @BACKAMOUNT=ISNULL(CAST(CAST(SUM(STL.AMOUNT*STL.CONVFACT2/STL.CONVFACT1) AS NUMERIC(28,6)) AS FLOAT) ,0) 
     FROM STLINE STL 
     INNER JOIN ORDERFICHE ORF ON ORF.LOGICALREF=STL.ORDERFICHEREF 
     WHERE ORF.STATUS<>3 AND STL.IOCODE=4 AND [email protected] AND [email protected] AND BARCODEREF IS NULL AND [email protected] 

     SET @[email protected]@BACKAMOUNT 
    END 
END 
ELSE 
BEGIN 
    --PARAMETEREREF=44 
    IF((SELECT DBO.FNC_EXPIRATIONDATE (@BARCODEREF,44))=1) 
    BEGIN 
     SET @RESULT=46 
     GOTO RESULT 
    END 
END 

IF(@CHECKTYPE<>2) 
BEGIN 
    IF (@LSTAMOUNT IS NULL) 
    BEGIN 
     IF @CHECKTYPE=-1 AND EXISTS (SELECT NULL 
      FROM STLINE 
      WHERE [email protected] AND (BRANCH<>@BRANCH OR SOURCEINDEX <> @SOURCEINDEX) 
      GROUP BY BARCODEREF 
      HAVING SUM(CAST(CAST(AMOUNT*(2-IOCODE)/ABS(2-IOCODE)*(CONVFACT2/CONVFACT1) AS NUMERIC(28,6)) AS FLOAT))>0) 
     BEGIN 
      SET @RESULT=55 --Barkod başka bir ambarda 
      GOTO RESULT 
     END 
     IF @CHECKTYPE=0 AND EXISTS (SELECT NULL 
      FROM STLINE 
      WHERE [email protected] AND [email protected] AND BARCODEREF IS NULL AND (BRANCH<>@BRANCH OR SOURCEINDEX <> @SOURCEINDEX) 
      GROUP BY ITEMREF,VARIANTREF,USREF 
      HAVING SUM(CAST(CAST(AMOUNT*(2-IOCODE)/ABS(2-IOCODE)*(CONVFACT2/CONVFACT1) AS NUMERIC(28,6)) AS FLOAT))>0) 
     BEGIN 
      SET @RESULT=55 --Barkod başka bir ambarda 
      GOTO RESULT 
     END 
     IF @CHECKTYPE=1 AND EXISTS (SELECT NULL 
      FROM {0}..LG_{1}_{2}_STLINE 
      WHERE [email protected] AND [email protected] AND CANCELLED=0 AND LPRODSTAT = 0 AND UINFO1>0 AND UINFO2>0 AND SOURCEINDEX <> @SOURCEINDEX 
      GROUP BY STOCKREF,VARIANTREF,USREF 
      HAVING SUM(CAST(CAST(AMOUNT*(2.5-IOCODE)/ABS(2.5-IOCODE)*(UINFO2/UINFO1) AS NUMERIC(28,6)) AS FLOAT))>0) 
     BEGIN 
      SET @RESULT=55 --Barkod başka bir ambarda 
      GOTO RESULT 
     END 
     SET @RESULT=2 --Barkod Stokta olmalı - Girişi yapılmamış ürün 
     GOTO RESULT 
    END 
    IF (@LSTAMOUNT<=0) 
    BEGIN 
     IF EXISTS (SELECT 1 FROM STLINE WHERE [email protected] AND [email protected]) 
     BEGIN 
      SET @RESULT=15 --Barkod Stokta olmalı - Mevcut emirde okutulmuş 
      GOTO RESULT 
     END 
     ELSE 
     BEGIN 
      SET @RESULT=3 --Barkod Stokta olmalı - Çıkışı yapılmış 
      GOTO RESULT 
     END 
    END 
END 

IF((@ISPARTIAL=0 OR @ISEAN=1) AND @PARTIALAMOUNT IS NOT NULL) 
BEGIN 
    SET @[email protected] 
    SET @UOMREF = @PARTIALUOMREF 
    SET @CONVFACT1 = @PARTIALCONVFACT1 
    SET @CONVFACT2 = @PARTIALCONVFACT2 
END 

IF EXISTS (SELECT 1 FROM ORDERLINE WHERE [email protected] AND [email protected]) 
BEGIN 
    DECLARE @ORLCOUNT INT 
    SELECT @USELABELUNITA=USELABELCARDUNITA FROM LABEL_PARAMETERS WHERE LOGICALREF=1 
    SELECT @ORLCOUNT=COUNT(LOGICALREF) FROM ORDERLINE WHERE [email protected] AND [email protected] AND [email protected] AND USREF = @USREF 

    IF (ISNULL(@ORLCOUNT,0)=0) 
    BEGIN 
     SET @RESULT=13 --ITEMREF emirde olmalı 
     GOTO RESULT 
    END 

    IF (@ISEAN=1 AND ISNULL(@PARTIALAMOUNT,0)=0) 
    BEGIN 
     SET @RESULT=11 
     GOTO RESULT 
    END 

    IF(@ISPARTIAL=0 AND @ISEAN=0) 
    BEGIN 
     IF NOT EXISTS(SELECT NULL FROM ORDERLINE ORL 
     INNER JOIN LABEL_CARD_UNITA LBLA ON LBLA.BARCODEREF = @BARCODEREF AND ORL.UOMREF = LBLA.UOMREF 
     WHERE [email protected] AND [email protected] AND [email protected]) 
     BEGIN 
      IF @USELABELUNITA=1 
      BEGIN 
       SET @RESULT=54 --etiket birim miktarı girilmelidir. 
       GOTO RESULT 
      END 
     END 

     DECLARE @TOAMOUNT FLOAT 
     DECLARE @TSAMOUNT FLOAT 

     SELECT @TOAMOUNT=CAST(CAST(SUM(ORL.AMOUNT*CASE WHEN LCU.LOGICALREF IS NULL THEN CASE WHEN @USELABELUNITA =1 THEN 0 ELSE ORL.CONVFACT2/ORL.CONVFACT1 END ELSE LCU.CONVFACT2/LCU.CONVFACT1 END)AS NUMERIC(28,6)) AS FLOAT) 
     FROM ORDERLINE ORL 
     LEFT OUTER JOIN LABEL_CARD_UNITA LCU ON LCU.BARCODEREF = @BARCODEREF AND ORL.UOMREF = LCU.UOMREF 
     WHERE [email protected] AND [email protected] AND [email protected] 

     SELECT @TSAMOUNT=CAST(CAST(SUM(STL.AMOUNT*(STL.CONVFACT2/STL.CONVFACT1))AS NUMERIC(28,6)) AS FLOAT) 
     FROM ORDERLINE ORL 
     INNER JOIN STLINE STL ON ORL.LOGICALREF = STL.ORDERLINEREF 
     WHERE [email protected] AND [email protected] AND [email protected]  

     --Parçalı seri barkod emir miktar aşımı kontrolü için parçalı miktar ana birime çevriliyor. 
     DECLARE @MAINAMOUNT FLOAT 
     SET @[email protected] 
     IF(@ISPARTIAL=0 AND @ISEAN=0 AND @PARTIALAMOUNT IS NOT NULL) 
     BEGIN 
      SET @[email protected]*@CONVFACT2/@CONVFACT1 
     END 

     --IF (@MAINAMOUNT+ ISNULL(@TSAMOUNT,0)> ISNULL(@TOAMOUNT,0)) 
IF EXISTS(SELECT * FROM ORDER_PARAMETER WHERE PARAMETERREF=118 AND VALUE=0) 
BEGIN 
     IF (CAST(CAST((ISNULL(@MAINAMOUNT,0)+ISNULL(@TSAMOUNT,0))AS NUMERIC(28,6))AS FLOAT)> ISNULL(CAST(CAST(@TOAMOUNT AS NUMERIC(28,6)) AS FLOAT),0)) 
     BEGIN 
      SET @RESULT=25 --Emir miktarı aşılmamalı 
      GOTO RESULT 
     END 
END 
    END 

    IF((@ISEAN=1) AND @PARTIALAMOUNT IS NOT NULL) 
    BEGIN 
     DECLARE @PTOAMOUNT FLOAT 
     DECLARE @PTSAMOUNT FLOAT 
     SELECT @PTOAMOUNT=ORL.AMOUNT,@PTSAMOUNT=CAST(CAST(SUM(STL.AMOUNT*(STL.CONVFACT2/STL.CONVFACT1))AS NUMERIC(28,6)) AS FLOAT) FROM ORDERLINE ORL 
     LEFT OUTER JOIN STLINE STL ON ORL.LOGICALREF=STL.ORDERLINEREF 
     WHERE [email protected] AND [email protected] AND [email protected] AND [email protected] 
     GROUP BY ORL.LOGICALREF,ORL.AMOUNT 
         IF EXISTS(SELECT * FROM ORDER_PARAMETER WHERE PARAMETERREF=118 AND VALUE=0) 
BEGIN 
     IF(CAST(CAST((@LSTAMOUNT + ISNULL(@PTSAMOUNT,0))AS NUMERIC(28,6))AS FLOAT) > ISNULL(@PTOAMOUNT,0)) 
     BEGIN 
      SET @RESULT=25 --Emir miktarı aşılmamalı 
      GOTO RESULT 
     END 
END 
    END 
END 


DECLARE @FIFOCONTROL INT 
SELECT @FIFOCONTROL=DBO.FNC_ENTRYDATE(@BARCODEREF,@BRANCH,@SOURCEINDEX,@PARAMETERREF) 
IF @FIFOCONTROL>0 
BEGIN 
    SET @RESULT=24 
    GOTO RESULT 
END 

IF(@ISEAN=0) 
BEGIN 
    DECLARE @ISCOUNTING SMALLINT 
    SELECT @ISCOUNTING=DBO.FNC_ISCOUNTING(@BRANCH,@SOURCEINDEX,@ITEMREF,@VARIANTREF,@BARCODEREF) 
    IF (@ISCOUNTING=2) --SAYIMDA OKUTULMAMIS MALZEME 
    BEGIN 
     SET @RESULT=21 
     GOTO RESULT 
    END 
END 

IF (@ISPARTIAL=1 OR (@ISEAN=1 AND ISNULL(@PARTIALAMOUNT,0)=0)) 
BEGIN 
    SET @RESULT=11 --miktar girilmeli 
    GOTO RESULT 
END 

-- HAREKET ÖZEL KODU 
DECLARE @SPECODE VARCHAR(50) 
IF EXISTS(SELECT * FROM ORDER_PARAMETER WHERE PARAMETERREF=101 AND VALUE=1) 
BEGIN 
    IF (@ISEAN=0) 
    BEGIN 
     SET @SPECODE = @BARCODESPECODE 
    END 
    ELSE IF (@ISEAN=1) 
    BEGIN 
     SET @SPECODE = @EANSPECODE 
    END 
END 

DECLARE @ORDERLINEREF INT 
DECLARE @DATE DATETIME 
SET @ORDERLINEREF=NULL 

IF (ISNULL(@ORLCOUNT,0)>1) 
BEGIN 
    DECLARE @CUOMREF INT 
    DECLARE @COAMOUNT FLOAT 
    DECLARE @CSAMOUNT FLOAT 
    DECLARE @CURRAMOUNT FLOAT 
    DECLARE @CCONVFACT1 FLOAT 
    DECLARE @CCONVFACT2 FLOAT 

    DECLARE CURSOR_SORDER CURSOR FOR SELECT LOGICALREF,AMOUNT,UOMREF,CONVFACT1,CONVFACT2 FROM ORDERLINE WHERE [email protected] AND [email protected] AND [email protected] ORDER BY (CASE WHEN [email protected] THEN 0 ELSE 1 END),ISNULL(LGORFICHEREF,2147483647) 
    OPEN CURSOR_SORDER 
    FETCH NEXT FROM CURSOR_SORDER INTO @ORDERLINEREF,@COAMOUNT,@CUOMREF,@CCONVFACT1,@CCONVFACT2 
    WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
     IF (ISNULL(@LSTAMOUNT,0)<=0) 
     BEGIN 
      BREAK 
     END 
     SET @CURRAMOUNT=0 
     IF((@ISEAN=1 OR @ISPARTIAL=0) AND @PARTIALAMOUNT IS NOT NULL) 
     BEGIN 
      SET @[email protected] 
      --SET @CONVFACT1 = @CCONVFACT1 
      --SET @CONVFACT2 = @CCONVFACT2 

     END 
     ELSE 
     BEGIN 
      SELECT @[email protected]*(CONVFACT1/CONVFACT2),@CONVFACT1=CONVFACT1,@CONVFACT2=CONVFACT2 FROM LABEL_CARD_UNITA WHERE BARCODEREF [email protected] AND UOMREF [email protected] 
     END 

     IF (ISNULL(@USELABELUNITA,0)=0 AND @CURRAMOUNT =0) 
     BEGIN 
      SET @CURRAMOUNT = @LSTAMOUNT*@CCONVFACT1/@CCONVFACT2 
      SET @CONVFACT1 = @CCONVFACT1 
      SET @CONVFACT2 = @CCONVFACT2 
     END 
     SELECT @CSAMOUNT=ISNULL(SUM(CAST(CAST(AMOUNT AS NUMERIC(28,6)) AS FLOAT)),0) FROM STLINE WHERE [email protected] AND [email protected] AND [email protected] AND [email protected] AND [email protected] 

     IF (@COAMOUNT>@CSAMOUNT AND ISNULL(@CURRAMOUNT,0)>0) 
     BEGIN 
      IF (@COAMOUNT >= @CSAMOUNT + (@CURRAMOUNT)) 
      BEGIN 
       SET @LSTAMOUNT=0 
      END 
      ELSE 
      BEGIN 
       SET @CURRAMOUNT = (@COAMOUNT - @CSAMOUNT) 
       SET @[email protected]@CURRAMOUNT 
      END 
      SET @DATE=GETDATE() 
      --SELECT 'bir', @STFICHEREF,8,4,@ITEMREF,@VARIANTREF,@BARCODEREF,@CURRAMOUNT,@CUOMREF,@USREF,@CONVFACT1,@CONVFACT2,@CLIENTREF,@BRANCH,@SOURCEINDEX,NULL,NULL,@DATE,@ORDERFICHEREF,@ORDERLINEREF,NULL,NULL,NULL,@TERMINALREF,@SPECODE 
      EXEC MOB_STLINE_INSERT @STFICHEREF,8,4,@ITEMREF,@VARIANTREF,@BARCODEREF,@CURRAMOUNT,@CUOMREF,@USREF,@CONVFACT1,@CONVFACT2,@CLIENTREF,@BRANCH,@SOURCEINDEX,NULL,NULL,@DATE,@ORDERFICHEREF,@ORDERLINEREF,NULL,NULL,NULL,@TERMINALREF,@SPECODE 

     END 
     FETCH NEXT FROM CURSOR_SORDER INTO @ORDERLINEREF,@COAMOUNT,@CUOMREF,@CCONVFACT1,@CCONVFACT2 
    END 
    CLOSE CURSOR_SORDER 
    DEALLOCATE CURSOR_SORDER 
END 
ELSE 
BEGIN 
    DECLARE @LUSTAMOUNT FLOAT 
    SET @DATE=GETDATE() 
    IF (ISNULL(@ORLCOUNT,0)=1) 
    BEGIN 
     DECLARE @OCONVFACT1 FLOAT 
     DECLARE @OCONVFACT2 FLOAT 
     SELECT @ORDERLINEREF=LOGICALREF,@UOMREF=UOMREF,@OCONVFACT1=CONVFACT1,@OCONVFACT2=CONVFACT2 FROM ORDERLINE WHERE [email protected] AND [email protected] AND [email protected] 
     IF((@ISEAN=1 OR @ISPARTIAL=0) AND @PARTIALAMOUNT IS NOT NULL) 
     BEGIN 
      SET @[email protected] 
     END 
     ELSE 
     BEGIN 


      SELECT @[email protected]*CONVFACT1/CONVFACT2,@CONVFACT1=CONVFACT1,@CONVFACT2=CONVFACT2 FROM LABEL_CARD_UNITA WHERE BARCODEREF [email protected] AND UOMREF [email protected] 
      IF (@LUSTAMOUNT IS NULL) 
      BEGIN 
       SET @LUSTAMOUNT = @LSTAMOUNT*@OCONVFACT1/@OCONVFACT2 
       SET @[email protected] 
       SET @[email protected] 
      END 
     END 
    END 
    IF @LUSTAMOUNT IS NULL 
    BEGIN 
     IF((@ISEAN=1 OR @ISPARTIAL=0) AND @PARTIALAMOUNT IS NOT NULL) 
     BEGIN 
      SET @[email protected] 
     END 
     ELSE 
     BEGIN 
      SET @[email protected]*@CONVFACT1/@CONVFACT2 
     END 
    END 
    --SELECT 'iki', @STFICHEREF,8,4,@ITEMREF,@BARCODEREF,ISNULL(@LUSTAMOUNT,@LSTAMOUNT),@UOMREF,@USREF,@CONVFACT1,@CONVFACT2,@CLIENTREF,@BRANCH,@SOURCEINDEX,NULL,NULL,@DATE,@ORDERFICHEREF,@ORDERLINEREF,NULL,NULL,NULL,@TERMINALREF,@SPECODE 
    EXEC MOB_STLINE_INSERT @STFICHEREF,8,4,@ITEMREF,@VARIANTREF,@BARCODEREF,@LUSTAMOUNT,@UOMREF,@USREF,@CONVFACT1,@CONVFACT2,@CLIENTREF,@BRANCH,@SOURCEINDEX,NULL,NULL,@DATE,@ORDERFICHEREF,@ORDERLINEREF,NULL,NULL,NULL,@TERMINALREF,@SPECODE 
END 


IF (@STATUS=0 OR @STATUS=6) 
BEGIN 
    UPDATE ORDERFICHE SET [STATUS]=1 WHERE [email protected] 
    INSERT INTO RECORD_LOG (MODULEREF,RECORDID,IDENTITYINFO,USERREF,TERMINALREF,PROCESSDATE,[TYPE],[DESCRIPTION]) 
    VALUES (103,@ORDERFICHEREF,'Emir Numarası:' + ' ' + @FICHENO,NULL,@TERMINALREF,@DATE,16,'Durumu : Yükleniyor') 
END 

RESULT: 
SELECT ISNULL(@RESULT,0) [RESULT] 
IF (@ISPARTIAL=1 OR @ISEAN=1) 
BEGIN 
    SELECT ISNULL(@LSTAMOUNT,0) [LSTAMOUNT],@ISEAN [ISEAN],@CHECKTYPE [CHECKTYPE],(SELECT TOP 1 UOMREF FROM ORDERLINE WHERE [email protected] AND [email protected] AND [email protected] ORDER BY (CASE WHEN [email protected] THEN 0 ELSE 1 END),ISNULL(LGORFICHEREF,2147483647)) [ORDERUOMREF] 

    IF(@ISEAN=1) 
    BEGIN 
     SELECT UNL.LOGICALREF,UNL.CODE,UNL.MAINUNIT,ISNULL(ORL.CONVFACT1,ITMA.CONVFACT1) [CONVFACT1],ISNULL(ORL.CONVFACT2,ITMA.CONVFACT2) [CONVFACT2], 
     CASE WHEN ORL.LOGICALREF IS NULL THEN 0 ELSE 1 END [ORDERUNIT], 
     CASE WHEN ITMA.UNITLINEREF = @UOMREF THEN 1 ELSE 0 END [DEFAULTUNIT], 
     ORL.AMOUNT - SUM(CAST(CAST(ISNULL(STL.AMOUNT,0) AS NUMERIC(28,6)) AS FLOAT)) [OAMOUNT] 
     FROM {0}..LG_{1}_ITMUNITA ITMA 
     INNER JOIN {0}..LG_{1}_UNITSETL UNL ON ITMA.UNITLINEREF = UNL.LOGICALREF 
     LEFT OUTER JOIN ORDERLINE ORL ON ORL.ORDERFICHEREF = @ORDERFICHEREF AND ORL.STFICHEREF = @STFICHEREF AND ORL.ITEMREF = ITMA.ITEMREF AND ORL.VARIANTREF = ITMA.VARIANTREF AND ORL.UOMREF = ITMA.UNITLINEREF 
     LEFT OUTER JOIN STLINE STL ON ORL.LOGICALREF = STL.ORDERLINEREF 
     WHERE ITMA.ITEMREF = @ITEMREF AND ITMA.VARIANTREF = @VARIANTREF 
     GROUP BY UNL.LINENR,UNL.LOGICALREF,UNL.CODE,UNL.MAINUNIT,ORL.CONVFACT1,ITMA.CONVFACT1,ORL.CONVFACT2,ITMA.CONVFACT2,ORL.LOGICALREF,ITMA.UNITLINEREF,ORL.AMOUNT 
     ORDER BY UNL.LINENR 
    END 
    ELSE 
    BEGIN 
     IF((@USELABELUNITA=1 AND ISNULL(@ORLCOUNT,0)>0) OR (ISNULL(@ORLCOUNT,0)=0)) 
     BEGIN 
      SELECT UNL.LOGICALREF,UNL.CODE,UNL.MAINUNIT,LBLA.CONVFACT1 [CONVFACT1],LBLA.CONVFACT2 [CONVFACT2], 
       CASE WHEN ORL.LOGICALREF IS NULL THEN 0 ELSE 1 END [ORDERUNIT], 
       CASE WHEN LBLA.UOMREF = @UOMREF THEN 1 ELSE 0 END [DEFAULTUNIT], 
       ORL.AMOUNT - SUM(CAST(CAST(ISNULL(STL.AMOUNT,0) AS NUMERIC(28,6)) AS FLOAT)) [OAMOUNT] 
      FROM LABEL_CARD_UNITA LBLA 
      INNER JOIN {0}..LG_{1}_UNITSETL UNL ON LBLA.UOMREF = UNL.LOGICALREF 
      LEFT OUTER JOIN ORDERLINE ORL ON ORL.ORDERFICHEREF = @ORDERFICHEREF AND ORL.STFICHEREF = @STFICHEREF AND ORL.ITEMREF = @ITEMREF AND ORL.VARIANTREF = @VARIANTREF AND ORL.UOMREF = LBLA.UOMREF 
      LEFT OUTER JOIN STLINE STL ON ORL.LOGICALREF = STL.ORDERLINEREF 
      WHERE LBLA.BARCODEREF = @BARCODEREF 
      GROUP BY UNL.LINENR,UNL.LOGICALREF,UNL.CODE,UNL.MAINUNIT,ORL.CONVFACT1,LBLA.CONVFACT1,ORL.CONVFACT2,LBLA.CONVFACT2,ORL.LOGICALREF,LBLA.UOMREF,ORL.AMOUNT 
      ORDER BY UNL.LINENR 
     END 
     ELSE IF(@USELABELUNITA=0 AND ISNULL(@ORLCOUNT,0)>0) 
     BEGIN 
      SELECT * FROM (
          SELECT UNL.LINENR,UNL.LOGICALREF ,UNL.CODE,UNL.MAINUNIT,LBLA.CONVFACT1 [CONVFACT1],LBLA.CONVFACT2 [CONVFACT2], 
           CASE WHEN ORL.LOGICALREF IS NULL THEN 0 ELSE 1 END [ORDERUNIT], 
           CASE WHEN LBLA.UOMREF = @UOMREF THEN 1 ELSE 0 END [DEFAULTUNIT], 
           ORL.AMOUNT - SUM(CAST(CAST(ISNULL(STL.AMOUNT,0) AS NUMERIC(28,6)) AS FLOAT)) [OAMOUNT],ORL.LOGICALREF [ORDERLINEREF] 
          FROM LABEL_CARD_UNITA LBLA 
          INNER JOIN {0}..LG_{1}_UNITSETL UNL ON LBLA.UOMREF = UNL.LOGICALREF 
          LEFT OUTER JOIN ORDERLINE ORL ON ORL.ORDERFICHEREF = @ORDERFICHEREF AND ORL.STFICHEREF = @STFICHEREF AND ORL.ITEMREF = @ITEMREF AND ORL.VARIANTREF = @VARIANTREF AND ORL.UOMREF = LBLA.UOMREF 
          LEFT OUTER JOIN STLINE STL ON ORL.LOGICALREF = STL.ORDERLINEREF 
          WHERE LBLA.BARCODEREF = @BARCODEREF 
          GROUP BY UNL.LINENR,UNL.LOGICALREF,UNL.CODE,UNL.MAINUNIT,ORL.CONVFACT1,LBLA.CONVFACT1,ORL.CONVFACT2,LBLA.CONVFACT2,ORL.LOGICALREF,LBLA.UOMREF,ORL.AMOUNT 


          UNION ALL 

          SELECT UNL.LINENR,UNL.LOGICALREF ,UNL.CODE,UNL.MAINUNIT,LBLA.CONVFACT1 [CONVFACT1],LBLA.CONVFACT2 [CONVFACT2], 
           CASE WHEN ORL.LOGICALREF IS NULL THEN 0 ELSE 1 END [ORDERUNIT], 
           CASE WHEN LBLA.UOMREF = @UOMREF THEN 1 ELSE 0 END [DEFAULTUNIT], 
           ORL.AMOUNT - SUM(CAST(CAST(ISNULL(STL.AMOUNT,0) AS NUMERIC(28,6)) AS FLOAT)) [OAMOUNT],ORL.LOGICALREF [ORDERLINEREF] 
          FROM ORDERLINE ORL 

          INNER JOIN {0}..LG_{1}_UNITSETL UNL ON ORL.UOMREF = UNL.LOGICALREF 
          LEFT OUTER JOIN LABEL_CARD_UNITA LBLA ON ORL.UOMREF=LBLA.UOMREF 
           --AND ORL.UOMREF = LBLA.UOMREF 
          LEFT OUTER JOIN STLINE STL ON ORL.LOGICALREF = STL.ORDERLINEREF 
          WHERE LBLA.BARCODEREF = @BARCODEREF AND ORL.ORDERFICHEREF = @ORDERFICHEREF AND ORL.STFICHEREF = @STFICHEREF AND ORL.ITEMREF = @ITEMREF AND ORL.VARIANTREF = @VARIANTREF AND LBLA.LOGICALREF IS NULL 
          GROUP BY UNL.LINENR,UNL.LOGICALREF,UNL.CODE,UNL.MAINUNIT,ORL.CONVFACT1,LBLA.CONVFACT1,ORL.CONVFACT2,LBLA.CONVFACT2,ORL.LOGICALREF,LBLA.UOMREF,ORL.AMOUNT 

      ) AS A 
      ORDER BY A.LINENR 
     END 
    END 
END 
+4

这里*关闭* [post](http://stackoverflow.com/questions/18783/favourite-performance-tuning-tricks)在这里可能会帮助你。 –

+0

感谢@GeomanYabes,但我不需要任何性能,现在它立即返回巨大的数据,但逻辑太长。我想我必须分开这个sp,如果我为此编写附加sps,感谢这个主题非常好,顺便说一下 –

+0

@arachnida,你不应该指望有人花费数小时来处理这个特定于你的业务逻辑的长脚本。 – FLICKER

回答

0

这很容易,我只是把每一个逻辑作为sperate sp。

之前

SELECT @FICHENO =ORF.FICHENO,@STATUS=ORF.[STATUS],@BRANCH=ORF.BRANCH,@SOURCEINDEX=ORF.SOURCEINDEX 
FROM ORDERFICHE ORF 
INNER JOIN ORDERFICHE_TERMINAL ORFT ON ORF.LOGICALREF=ORFT.ORDERFICHEREF 
WHERE [email protected] AND [email protected] 

IF (@STATUS IS NULL OR (@STATUS NOT IN (0,1,6))) 
BEGIN 
    SET @RESULT=14 --Fişe terminal atanmış ve fiş statusu tamamlandıdan küçük olacak 
    GOTO RESULT 
END 

EXEC PRX_MINT_FICHE_STATUS_CONTROL @ORDERFICHEREF,@TERMINALREF,@RESULT OUTPUT,@FICHENO OUTPUT,@BRANCH OUTPUT,@SOURCEINDEX OUTPUT 
IF @RESULT>0 
GOTO RESULT; 

我写的程序相同的代码我创造,我需要的下一步输出变量。