2011-05-16 70 views
0

首先,我知道有很多關於使用CASE代替DECODE的帖子等,但它們似乎不符合我的關注。SQL Server 2008 - 實現DECODE

我想將Oracle 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 Server實現?我似乎無法解決如何使用CASE WHEN THEN等來創建基於動態數據的列標題。

對不起,如果我問的是不明確的。謝謝你盡你所能的幫助。

BBZ

回答

0

那麼甲骨文相當於使用情況是:

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服務器來代替。

+0

啊,好的,謝謝你指出。請看看,儘管我認爲sql_str中的8000個最大字符數將不夠:s – Bob 2011-05-16 14:53:42

+0

@bob您可以使用SQL_Str變量中的varchar(max) – HLGEM 2011-05-16 16:05:47

+0

@HGLEM:完美,謝謝,不知道這一點。 – Bob 2011-05-16 16:26:46