2014-11-17 117 views
0

我的SP如下:當多個語句的case語句

ALTER PROC ME_SP_GETORDERASSIGNMENT_DETAILS       
@COMPANY_CODE VARCHAR(5),                 
@TRANSID VARCHAR(10),                 
@FYEAR VARCHAR(5),                 
@SMODE VARCHAR(2),                 
@USERID VARCHAR(5),                 
@PLANT_CODE NUMERIC(5,0),                 
@TRANSNO VARCHAR(10),                 
@STATUS_CODE VARCHAR(10),   
@FROM_DATE VARCHAR(15)=NULL,   
@TO_DATE VARCHAR(15)=NULL                 
AS 
--New SP created By Ashwini on 11-Nov-2014 for getting order assignment details 
BEGIN 

DECLARE @SAGENT_CODE VARCHAR(10)             
SELECT @SAGENT_CODE = A.SAGENT_CODE FROM SD_SAGENT_C A        
INNER JOIN GL_USER_C B ON A.PERSONNEL_ID = B.PERSONNEL_ID AND B.USER_ID = @USERID 

SELECT CAST(@PLANT_CODE as Varchar) AS PLANT_CODE, @TRANSNO AS TRANSACTIONNO,@TRANSID AS TRANSID,@USERID AS USERID, 
CAST(0 AS BIT) AS PROCESS, 
CAST(0 AS BIT) AS CANCEL,         
isnull(F.CUSTOMER_NO,'') AS ASSIGN_COURIER,                 
isnull(F.NAME1,'') AS ASSIGN_COURIER_NAME,                 
isnull(F.CUSTOMER_CLASS,'') AS DELIVERY_MODE,                 
A.PAYMENT_TYPE,                 
A.PAYMENT_MODE,                 
A.ORDER_STATUS AS STATUS_CODE,             
E.DESCRIPTION AS STATUS_DESC,                 
A.ORDER_NO, A.ORDER_DATE,                 
A.CUST_CODE ,                 
(ISNULL(C.CUST_FNAME,'') + '' + ISNULL(C.CUST_MNAME,'') +''+ISNULL(C.CUST_LNAME,'')) CUSTOMER_NAME,       
''CUSTOMER_ADDRESS, B.ITEM_NO AS LINE_ITEM_NO,       
B.MAT_CODE,D.DESCRIPTION AS MAT_DESC ,ISNULL(D.DRAWING_NUMBER,'') AS VENDOR_NO, B.QTY, C.CUST_PSTATE AS STATE, '' AS TALUKA,C.CUST_PCITY AS DISTRICT ,C.CUST_PPINCODE AS PINCODE,       
CAST(1 AS BIT) AS MANULAUTO, '' AS ASSIGN_CUSTOMER1 ,       
C.CUST_PPOSTOFFICE AS POST_OFF ,C.CUST_PPONAME AS PO_NAME, B.ITEM_SALETYPE , G.DESCRIPTION as PRIORITY, H.DESCRIPTION AS PAYMENT_DESC       

FROM                 
RT_ORDER_H A                 
INNER JOIN                 
RT_ORDER_T B                 
ON                 
A.ORDER_NO = B.ORDER_NO                 
INNER JOIN                 
RT_CUSTADD_M C                 
ON A.CUST_CODE = C.CUST_CODE               
INNER JOIN MM_MATERIAL_BASIC_M D               
ON B.MAT_CODE=D.MAT_CODE 
LEFT OUTER JOIN              
RT_ORDER_STATUS E              
ON A.ORDER_STATUS = E.STATUS_CODE  
LEFT JOIN SD_CUSTADD_M F ON A.DELIVERY_BY = F.CUSTOMER_NO       
LEFT JOIN RT_ORDER_PRIORITY_C G ON A.ORDER_PRIORITY = G.PRIORITY_TYPE       
INNER JOIN RT_PAYTYPE_C H ON A.PAYMENT_TYPE = H.PAYMENT_TYPE 
INNER JOIN MM_MATERIAL_PARENT_GRP_D I ON B.MAT_CODE=I.MAT_CODE      

WHERE [email protected]_CODE and year(a.ORDER_DATE)>=2014   
--END    

AND A.PAYMENT_TYPE = CASE WHEN @STATUS_CODE= '00' then 'PT0001' else A.PAYMENT_TYPE end     

AND (F.SAGENT_CODE = ISNULL(@SAGENT_CODE, 'XX') OR C.CUST_PSTATE_CODE IN (SELECT STATE_CODE FROM SD_SAGENT_STATE_C WHERE SAGENT_CODE [email protected]_CODE)) 
AND I.PARENT_DESC='Vendor Offers' AND I.ACTIVE=1 
and  
    CASE   
     WHEN (isnull(@FROM_DATE,'')<>'' and ISNULL(@TO_DATE,'')='') THEN Convert(date,A.order_date) >=CONVERT(datetime,@FROM_DATE,105)   
     WHEN isnull(@FROM_DATE,'')='' and ISNULL(@TO_DATE,'')<>'' THEN Convert(date,A.order_date)<=CONVERT(datetime,@TO_DATE,105)  
     WHEN isnull(@FROM_DATE,'')<>'' and ISNULL(@TO_DATE,'')<>'' THEN Convert(date,A.order_date)<=CONVERT(datetime,@TO_DATE,105) and CONVERT(Date,A.ORDER_DATE)>=CONVERT(datetime,@FROM_DATE ,105))   
    END 
ORDER BY A.ORDER_PRIORITY DESC,C.CUST_PSTATE,D.DESCRIPTION 
END 

該SP提供了一個錯誤「附近有語法錯誤‘>’。」

我必須這樣做,如果@FROM_DATE和@TO_DATE都爲空然後語句AND I.ACTIVE = 1沒有條件應該添加。如果@FROM_DATE不是空白,並且@TO_DATE爲空,那麼一個條件應該像這樣添加適用於所有場景。 如何解決這個問題?

+0

檢查評估結果之外CASE語句。 或將結果集放入#table中,並將#table的過濾單獨進行如果其他條件 –

回答

0

涉及CASE謂詞的格式不正確:

AND CASE 
     WHEN ... THEN ... 
     WHEN ... THEN ... 
    END -- missing a condition here 

爲了解決這個問題,返工你CASE聲明是這樣的:

AND 
CASE   
    WHEN (isnull(@FROM_DATE,'')<>'' and ISNULL(@TO_DATE,'')='') and Convert(date,A.order_date) >=CONVERT(datetime,@FROM_DATE,105) THEN 1 
    WHEN isnull(@FROM_DATE,'')='' and ISNULL(@TO_DATE,'')<>'' and Convert(date,A.order_date)<=CONVERT(datetime,@TO_DATE,105) THEN 1 
    WHEN isnull(@FROM_DATE,'')<>'' and ISNULL(@TO_DATE,'')<>'' and Convert(date,A.order_date)<=CONVERT(datetime,@TO_DATE,105) and CONVERT(Date,A.ORDER_DATE)>=CONVERT(datetime,@FROM_DATE ,105)) THEN 1 
    ELSE 0 
END = 1