Sql server Case语句中的多个when语句

Sql server Case语句中的多个when语句,sql-server,Sql Server,我的SP如下所示: ALTER PROC ME_SP_GETORDERASSIGNMENT_DETAILS @COMPANY_CODE VARCHAR(5), @TRANSID VARCHAR(10),

我的SP如下所示:

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  A.ORDER_STATUS=@STATUS_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 =@SAGENT_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
ALTER PROC ME\u SP\u GETORDERASSIGNMENT\u详细信息
@公司代码VARCHAR(5),
@TRANSID VARCHAR(10),
@FYEAR VARCHAR(5),
@斯莫德·瓦尔查尔(2),
@USERID VARCHAR(5),
@工厂代码数字(5,0),
@TRANSNO VARCHAR(10),
@状态代码VARCHAR(10),
@FROM_DATE VARCHAR(15)=空,
@截止日期VARCHAR(15)=空
作为
--Ashwini于2014年11月11日为获取订单分配详细信息而创建的新SP
开始
声明@SAGENT_代码VARCHAR(10)
从SD\U SAGENT\U C A中选择@SAGENT\U CODE=A.SAGENT\U CODE
A.personals\u ID=B.personals\u ID和B.USER\u ID=@USERID上的内部连接GL\u USER\u C B
选择CAST(@PLANT_CODE作为Varchar)作为PLANT_CODE、@TRANSNO作为TRANSACTIONNO、@TRANSID作为TRANSID、@USERID作为USERID,
转换(0为位)为过程,
强制转换(0为位)为取消,
isnull(F.客户编号“”)作为指定快递员,
isnull(F.NAME1,'')作为ASSIGN\u COURIER\u名称,
isnull(F.CUSTOMER_类“”)作为交付模式,
A.付款类型,
A.付款方式,
A.订单状态作为状态代码,
E.状态描述,
订单号,订单日期,
A.客户代码,
(ISNULL(C.CUST\u FNAME,)+“”+ISNULL(C.CUST\u MNAME,)+“”+ISNULL(C.CUST\u LNAME,))客户名称,
“客户地址,B.项目编号作为行项目编号,
B.物料代码,D.描述为物料描述,ISNULL(D.图纸编号,)为供应商编号,B.数量,C.客户状态为状态,C.客户城市为地区,C.客户代码为PINCODE,
将(1作为位)转换为MANULAUTO,“”作为分配给客户1,
C.CUST作为POST_OFF,C.CUST作为PO_NAME,B.ITEM_SALETYPE,G.DESCRIPTION作为PRIORITY,H.DESCRIPTION作为PAYMENT DESC
从…起
订单号
内连接
RT\u订单\u T B
在…上
A.订单号=B.订单号
内连接
RT_CUSTADD_M C
关于A.CUST\u代码=C.CUST\u代码
内部连接MM\U材料\U基本\U M D
在B.MAT_代码上=D.MAT_代码
左外连接
RT\u订单\u状态E
在A.ORDER\u状态=E.STATUS\u代码上
左连接SD\U CUSTADD\U M F ON A.DELIVERY\u BY=F.CUSTOMER\u NO
左连接RT\u顺序\u优先级\u C G在A.ORDER\u PRIORITY=G.PRIORITY\u类型上
A.PAYMENT\u TYPE=H.PAYMENT\u TYPE上的内部联接RT\u PAYMENT类型\u C H
B.MAT_代码=I.MAT_代码上的内部连接MM_材料_母材_GRP_D I
其中A.订单\状态=@状态\代码和年份(A.订单\日期)>=2014
--结束
当@STATUS\u CODE='00'然后是'PT0001'时,A.PAYMENT\u TYPE=情况,否则A.PAYMENT\u TYPE结束
和(F.SAGENT_CODE=ISNULL(@SAGENT_CODE,'XX')或C.CUST_PSTATE_CODE IN(从SD___STATE_C中选择STATE_CODE,其中SAGENT_CODE=@SAGENT_CODE))
I.PARENT_DESC='Vendor Offers'和I.ACTIVE=1
及
案例
当(isnull(@FROM_DATE,“)”和isnull(@TO_DATE,“)=”)转换(DATE,A.order_DATE)>=Convert(datetime,@FROM_DATE,105)
当isnull(@FROM_DATE,“)=”和isnull(@TO_DATE,“)”时,则转换为(DATE,A.order_DATE)”

我必须这样做,如果@FROM_DATE和@to_DATE都是空的,那么after语句和I.ACTIVE=1不应该添加任何条件。如果@FROM_DATE不是空的,@to_DATE是空的,那么所有场景中都应该像这样添加一个条件。
如何解决这个问题?

涉及
大小写的谓词格式不正确:

AND CASE
      WHEN ... THEN ...
      WHEN ... THEN ...
    END -- missing a condition here
要解决此问题,请按如下方式重新编写
案例
语句:

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
和
案例
当(isnull(@FROM_DATE,“)”和isnull(@TO_DATE,“)=”)和Convert(DATE,A.order_DATE)>=Convert(datetime,@FROM_DATE,105)时,则1

当isnull(@FROM_DATE,“)=”和isnull(@TO_DATE,“)”和Convert(DATE,A.order_DATE)检查以评估CASE语句之外的结果时。或者将结果集放入#表中,并将#表作为单独的If-Else条件进行过滤