2011-05-16 40 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