2011-05-16 6 views
0

먼저 DECODE 대신 CASE를 사용하는 것과 관련된 게시물이 많이 있지만 그 내용이 내 관심사와 일치하지 않는 것으로 알고 있습니다.SQL Server 2008 - 구현 DECODE

SQL PL/SQL 프로 시저를 SQL Server로 변환하려고합니다. 이 프로시 저는 SQL 문을 동적으로 작성하고 DECODE 함수를 사용하여 x-tab을 작성합니다. 절차는 너무하다 :

PROCEDURE GET_XFORM_DATALOGS (
    fLOTCODE IN VARCHAR2, 
    THEDATA OUT SYS_REFCURSOR) IS 

    -- VARIABLE DECLARATIONS 

    TYPE loc_array_type IS TABLE OF VARCHAR2(40); -- array type 
    loc_array loc_array_type;  -- array for test names 

    prod VARCHAR2(20); -- product ID 
    step VARCHAR2(20); -- step ID 
    sql_str VARCHAR2(32000); -- SQL statement 


    -- EXECUTABLE CODE 

    BEGIN -- executable part starts here 

     -- get the test names for the given lot code 
     SELECT 
      PT_TESTNAME BULK COLLECT INTO loc_array 
     FROM 
      (
       SELECT DISTINCT 
        TESTPARMS.PT_TESTNAME, 
        TESTPARMS.PT_TESTNUM 
       FROM 
        "PRETEST"[email protected]_DBLINK LOT, 
        "PRETEST"[email protected]_DBLINK MEASURE, 
        "PRETEST"[email protected]_DBLINK TESTPARMS 
       WHERE 
        LOT.PT_LOTSQ = MEASURE.PT_LOTSQ AND 
        MEASURE.PT_LOTSQ = TESTPARMS.PT_LOTSQ AND 
        MEASURE.PT_TESTNUM = TESTPARMS.PT_TESTNUM AND 
        LOT.PT_LOTID = fLOTCODE 
       ORDER BY 
       PT_TESTNUM 
      ); 

     -- build the SQL string 
     sql_str := ''; 
     sql_str := sql_str || 'SELECT '; 
     sql_str := sql_str || ' PRETEST_LOT.PT_LOTID, '; 
     sql_str := sql_str || ' PRETEST_LOT.PT_LOCTYPE, ' ; 
     sql_str := sql_str || ' PRETEST_LOT.PT_TESTDATE, '; 
     sql_str := sql_str || ' PRETEST_MEASURE.PT_WAFERID, '; 
     sql_str := sql_str || ' PRETEST_MEASURE.PT_XCOORD, '; 
     sql_str := sql_str || ' PRETEST_MEASURE.PT_YCOORD, '; 

     -- add the decodes for column headings 
     FOR i IN loc_array.first..loc_array.last LOOP 
      sql_str := sql_str || 'max (decode (PRETEST_TEST_PARMS.PT_TESTNAME, ''' 
       || loc_array(i) || ''', PRETEST_MEASURE.PT_MEAS_VALUE, null)) ' 
       || loc_array(i); 
       IF (i < loc_array.last) THEN 
        sql_str := sql_str || ', '; 
       END IF; 
     END LOOP; 

     -- build the remainder of the SQL 
     sql_str := sql_str || ' FROM '; 
     sql_str := sql_str || '  "PRETEST"[email protected]_DBLINK PRETEST_LOT, '; 
     sql_str := sql_str || '  "PRETEST"[email protected]_DBLINK PRETEST_MEASURE, '; 
     sql_str := sql_str || '  "PRETEST"[email protected]_DBLINK PRETEST_TEST_PARMS '; 

     sql_str := sql_str || ' WHERE '; 
     sql_str := sql_str || '  PRETEST_LOT.PT_LOTSQ = PRETEST_MEASURE.PT_LOTSQ AND '; 
     sql_str := sql_str || '  PRETEST_MEASURE.PT_LOTSQ = PRETEST_TEST_PARMS.PT_LOTSQ AND '; 
     sql_str := sql_str || '  PRETEST_MEASURE.PT_TESTNUM = PRETEST_TEST_PARMS.PT_TESTNUM AND '; 
     sql_str := sql_str || '  (PRETEST_LOT.PT_LOTID = :fFLOTCODE) '; 

     sql_str := sql_str || ' GROUP BY '; 
     sql_str := sql_str || '  PRETEST_LOT.PT_LOTID, '; 
     sql_str := sql_str || '  PRETEST_LOT.PT_LOCTYPE, '; 
     sql_str := sql_str || '  PRETEST_LOT.PT_TESTDATE, '; 
     sql_str := sql_str || ' PRETEST_MEASURE.PT_WAFERID, '; 
     sql_str := sql_str || ' PRETEST_MEASURE.PT_XCOORD, '; 
     sql_str := sql_str || ' PRETEST_MEASURE.PT_YCOORD '; 

     sql_str := sql_str || ' ORDER BY '; 
     sql_str := sql_str || '  PRETEST_LOT.PT_TESTDATE '; 

     -- run the query 
     OPEN THEDATA FOR sql_str USING fLOTCODE; 

END GET_XFORM_DATALOGS; 

내가 가진 문제는,이 SQL 서버에서 구현 할 수있을 것입니다입니까? 동적 데이터를 기반으로 열 머리글을 만들 때 등을 사용할 방법을 찾지 못하는 것 같습니다.

미안 내가 묻는 것이 불분명하다면. 제공 할 수있는 도움에 감사드립니다. BBZ

답변

0

음 CASE를 사용하여 Oracle 동등한은 다음과 같습니다

sql_str := sql_str || 'max (CASE WHEN PRETEST_TEST_PARMS.PT_TESTNAME = ''' 
    || loc_array(i) || ''' THEN PRETEST_MEASURE.PT_MEAS_VALUE END) ' 
    || loc_array(i); 

그래서 대신 SQL Server에 그 변환하려고합니다.

+0

아, 그걸 지적 해 주셔서 감사합니다. # – Bob

+0

@bob SQL_Str 변수에서 varchar (max)를 사용할 수 있습니다. – HLGEM

+0

@HGLEM : 완벽하고 고마워. 그걸 몰랐는데. – Bob