2009-11-16 6 views
0

Voici ma procédure de curseur:curseur pour SQL Server2005

DECLARE C1 CURSOR LOCAL FOR 
    SELECT DISTINCT 
     PPTR_MATCH_REF_NO, 
     PPTR_LDGR_CODE, 
     PPTR_SLMAST_ACNO, 
     PPTR_PPN_STATUS 
    FROM GLAS_PPN_TRANSACTIONS 
    WHERE PPTR_COMP_CODE = @COMP_CODE 
AND ISNULL(PPTR_PPN_STATUS, 'X') = 'V' 

DECLARE @MATCH_REF_NO NUMERIC(10,0), 
    @LDGR_CODE VARCHAR(MAX), 
    @SLMAST_ACNO VARCHAR(MAX), 
    @PPN_STATUS VARCHAR(2), 
    @ACCT_NAME VARCHAR(MAX) 
BEGIN 

    OPEN C1 

    FETCH NEXT FROM C1 INTO @MATCH_REF_NO,@LDGR_CODE,@SLMAST_ACNO,@PPN_STATUS 
    WHILE @@FETCH_STATUS =0 

    BEGIN 
     -- SET @MATCH_REF_NO = PPTR_MATCH_REF_NO 
     -- SET @LDGR_CODE = PPTR_LDGR_CODE 
     -- SET @SLMAST_ACNO = PPTR_SLMAST_ACNO 

    SELECT @ACCT_NAME = COAD_PTY_FULL_NAME 
     FROM GLAS_SBLGR_MASTERS, 
      GLAS_PTY_ADDRESS 
    WHERE SLMA_COMP_CODE = @COMP_CODE 
     AND SLMA_LDGRCTL_YEAR = DBO.GLAS_VALIDATIONS_GET_OPEN_YEAR(@COMP_CODE) 
     AND SLMA_LDGRCTL_CODE = @LDGR_CODE 
     AND SLMA_STATUS = 'A' 
     AND SLMA_ACNO = @SLMAST_ACNO 
     AND COAD_COMP_CODE = SLMA_COMP_CODE 
     AND COAD_ADDR_ID = SLMA_ADDR_ID 

    IF @PPN_STATUS = 'V' 
     BEGIN 
      SELECT @PPN_STATUS = 'VER' 
     END 

    FETCH NEXT FROM C1 INTO @MATCH_REF_NO,@LDGR_CODE,@SLMAST_ACNO,@PPN_STATUS    
    END 
     CLOSE C1 
    END 
    DEALLOCATE C1 
END 

Comment puis-je retrive @MATCH_REF_NO, @LDGR_CODE, @SLMAST_ACNO, @PPN_STATUS et @ACCT_NAME en même temps?

ici 2 instructions select est là comment puis-je combiner

Répondre

2

Vous pouvez simplifier cela en utilisant une expression table commune (CTE) dans SQL Server 2005 - vous obtiendrez quelque chose comme:

WITH Select1 AS 
(
    SELECT DISTINCT 
     PPTR_MATCH_REF_NO, 
     PPTR_LDGR_CODE, 
     PPTR_SLMAST_ACNO, 
     PPTR_PPN_STATUS 
    FROM GLAS_PPN_TRANSACTIONS 
    WHERE PPTR_COMP_CODE = @COMP_CODE 
AND ISNULL(PPTR_PPN_STATUS, 'X') = 'V' 
) 
SELECT 
    COAD_PTY_FULL_NAME 
FROM 
    GLAS_SBLGR_MASTERS, GLAS_PTY_ADDRESS, Select1 
WHERE 
    SLMA_COMP_CODE = Select1.COMP_CODE 
    AND SLMA_LDGRCTL_YEAR = DBO.GLAS_VALIDATIONS_GET_OPEN_YEAR(Select1.COMP_CODE) 
    AND SLMA_LDGRCTL_CODE = Select1.LDGR_CODE 
    AND SLMA_STATUS = 'A' 
    AND SLMA_ACNO = Select1.SLMAST_ACNO 
    AND COAD_COMP_CODE = SLMA_COMP_CODE 
    AND COAD_ADDR_ID = SLMA_ADDR_ID 

Ce que je ne peux pas déterminer à partir du code que vous avez posté, c'est comment le GLAS_SBLGR_MASTERS et le GLAS_PTY_ADDRESS sont joints (à quelle condition). Il suffit de préciser ces deux dans la clause FROM doit être évité - utiliser les instructions SQL norme ANSI JOIN:

FROM GLAS_SBLGR_MASTERS 
INNER JOIN GLAS_PTY_ADDRESS ON ??????? 

Marc

Questions connexes