2012-01-30 122 views
1

更新:すべてのお手伝いがありがとう!私は結果を見渡すためにちょっとした時間を取る必要があり、私はその答えに間違いなく印をつけます。本当に皆様のご意見をお待ちしております!Oracle PL/SQLからMicrosoft T-SQLへのクエリの変換

次の問合せは、データソースの変更に対応するためにOracel PL/SQLからT-SQLに変換する必要があります。私はすでにロジックを分離するために必要な作業(まだPL/SQLで書かれています)を行い、残りの部分を調整するだけで済みます。特にTO_DATEのようなものは変換するのが難しいので、私はStackOverflowを使うことにしました。

私はすでにSwisSQLツールについて知っていますが、これは単なるクエリの単なるインスタンスであり、その製品を使って変換する必要はありません。適切なT-SQLシンタクスを使用するようにクエリを変換する際の助けとなることは、大いに感謝しています。お時間をいただき、ありがとうございます、ここで問題になっているクエリです:

SELECT 
      F.TYPE_ID, 
      TRIM(f.event_type_name), 
      TRIM(e.event_name), 
      NVL(trim(e.event_title),' '), 
      e.cur_event_state, 
      TO_CHAR(D.EV_START_DT, 'YYYYMMDD') , 
      TO_CHAR(D.EV_START_DT,'HH24MI') , 
      TO_CHAR(D.EV_END_DT, 'YYYYMMDD') , 
      TO_CHAR(D.EV_END_DT,'HH24MI') , 
      TO_char(d.EV_START_DT, 'D') 
    from rooms C, 
     SP_RESERVATIONS D, 
     EVENTS E, 
     event_types f 
    where @Room = TRIM(replace(C.room_short(+),'-','*')) 
AND C.ROOM_ID = D.ROOM_ID 
     AND D.EVENT_ID = E.EVENT_ID 
     and e.event_type_id = f.type_id 
     and f.type_id in ('22','40','70','71','72','105','121','119') 
     AND (D.EV_START_DT 
        BETWEEN TO_DATE(:WS-TERM-START-DATE,'YYYYMMDD') 
         AND TO_DATE(:WS-TERM-END-DATE,'YYYYMMDD') 
     OR D.EV_END_DT 
        BETWEEN TO_DATE(:WS-TERM-START-DATE,'YYYYMMDD') 
         AND TO_DATE(:WS-TERM-END-DATE,'YYYYMMDD')) 
     and not e.cur_event_state = '59' 

ありがとう!

+3

あなたの質問は??????? –

+0

あなたのフィルタでは 'B.rooms_id'のようないくつかのカラムを使いますが、' FROM'のテーブルBは表示されません – Lamak

+0

これをキャッチしてくれてありがとう、Lamark。クエリが正しい値で更新されました。 私の質問は、このクエリをPL/SQLからT-SQLに変換することです。 – user1179071

答えて

1

[OK]を、このクエリを試してみてください。

SELECT f.type_id, 
     LTRIM(RTRIM(f.event_type_name)), 
     LTRIM(RTRIM(e.event_name)), 
     ISNULL(LTRIM(RTRIM(e.event_title)), ' '), 
     e.cur_event_state, 
     CONVERT(VARCHAR(8), d.ev_start_dt, 112), 
     CONVERT(VARCHAR(5), d.ev_start_dt, 114), 
     CONVERT(VARCHAR(8), d.ev_end_dt, 112), 
     CONVERT(VARCHAR(5), d.ev_end_dt, 114), 
     DATENAME(DAY, d.ev_start_dt) 
FROM rooms c 
     INNER JOIN sp_reservations d 
     ON c.room_id = d.room_id 
     INNER JOIN [EVENTS] e 
     ON d.event_id = e.event_id 
     INNER JOIN event_types f 
     ON e.event_type_id = f.[type_id] 
WHERE @Room = RTRIM(LTRIM(REPLACE(c.room_short, '-', '*'))) 
     AND f.[type_id] IN ('22', '40', '70', '71', 
          '72', '105', '121', '119') 
     AND (d.ev_start_dt BETWEEN CONVERT(DATETIME, [WS-TERM-START-DATE], 112) 
            AND 
             CONVERT(DATETIME, [WS-TERM-END-DATE], 
             112) 
       OR d.ev_end_dt BETWEEN CONVERT(DATETIME, [WS-TERM-START-DATE], 112 
            ) AND 
             CONVERT(DATETIME, [WS-TERM-END-DATE], 
             112)) 
     AND NOT e.cur_event_state = '59' 
+0

ありがとう、Lamark!私は今すぐこれを試し、結果を得て戻ってくるだろう。 – user1179071

+0

これはうまくいくと思います!どうもありがとうございました! – user1179071

+0

私は、OracleのNVL(trim(e.event_title)、 ') 'もスペースを含む文字列を1スペースの文字列に変換することも考えています。 Oracleでは空の文字列)。これは、空文字列とNULL文字列がどのように処理されるかに応じて、SQL Serverで特別な注意が必要な場合と不要な場合があります。 –

2

ここでは、Oracleのコードは、SQLフィドルようだ:編集したhttp://sqlfiddle.com/#!3/5fe1b/2

SELECT 
      F.TYPE_ID, 
      RTRIM(LTRIM(f.event_type_name)), 
      RTRIM(LTRIM(e.event_name)), 
      COALESCE(RTRIM(ltrim(e.event_title)),' '), 
      e.cur_event_state, 
      convert(varchar, D.EV_START_DT, 112) , 
      datepart(hh, D.EV_START_DT) , 
      convert(varchar, D.EV_END_DT, 112) , 
      datepart(hh, D.EV_END_DT) , 
      datepart(d, d.EV_START_DT) 
    from rooms C, 
     SP_RESERVATIONS D, 
     EVENTS E, 
     event_types f 
    where 'Big Room' = RTRIM(LTRIM(replace(C.room_short,'-','*'))) 
AND C.ROOM_ID = D.ROOM_ID 
     AND D.EVENT_ID = E.EVENT_ID 
     and e.event_type_id = f.type_id 
     and f.type_id in ('22','40','70','71','72','105','121','119') 
     AND (D.EV_START_DT 
        BETWEEN '2012-01-01' 
         AND '2012-02-01' 
     OR D.EV_END_DT 
        BETWEEN '2012-01-01' 
         AND '2012-02-01') 
     and not e.cur_event_state = '59' 

http://sqlfiddle.com/#!4/80d20/4

そしてここでは、SQL Serverなどの修正版です ltrimでrtrimを追加

+1

FYI - http://sqlfiddle.comは私のサイトです –

+0

このサイトに問い合わせていただきありがとうございます。とても有難い! – user1179071

0

これは私の答えです。それが動作しない場合は教えてください。

SELECT 
    f.type_id             , 
    RTRIM(LTRIM(f.event_type_name))        , 
    RTRIM(LTRIM(e.event_name ))        , 
    ISNULL(RTRIM(LTRIM(e.event_title)),' ')      , 
    e.cur_event_state           , 
    CONVERT(VARCHAR(8),d.ev_start_dt , 112)      ,  -- 'YYYYMMDD' 
    CONVERT(VARCHAR(2),d.ev_start_dt , 114) + 
    SUBSTRING(CONVERT(VARCHAR(12),d.ev_start_dt , 114),4,2)  ,  -- 'HH24MI' 
    CONVERT(VARCHAR(8),d.ev_end_dt , 112)      ,  -- 'YYYYMMDD' 
    CONVERT(VARCHAR(2),d.ev_end_dt , 114) +  
    SUBSTRING(CONVERT(VARCHAR(12),d.ev_end_dt , 114),4,2)  ,  -- 'HH24MI' 
    DATENAME(DAY, d.ev_start_dt)          -- 'D'  
FROM 
    rooms c 
     INNER JOIN sp_reservations d 
     ON c.room_id = d.room_id 
     INNER JOIN events e 
     ON d.event_id = e.event_id 
     INNER JOIN event_types f 
     ON e.event_type_id = f.type_id 
WHERE 
    [email protected] = RTRIM(LTRIM(REPLACE(c.room_short(+),'-','*'))) and 
    --variable = LOJ table.column above is not a real filter 
    f.type_id IN ('22','40','70','71','72','105','121','119') 
    and (d.ev_start_dt 
      BETWEEN CONVERT(datetime,[WS-TERM-START-DATE],112) 
       AND CONVERT(datetime,[WS-TERM-END-DATE] ,112) 
     or d.ev_end_dt 
      BETWEEN CONVERT(datetime,[WS-TERM-START-DATE],112) 
       AND CONVERT(datetime,[WS-TERM-END-DATE] ,112)) 
    and e.cur_event_state != '59'; 
GO 
関連する問題