2012-01-30 67 views
1

更新:感谢您的所有帮助家伙!我只需要花一点时间来查看结果,我肯定会标记答案。真的很感谢大家的反馈!从Oracle PL/SQL转换查询到微软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

而你的问题是??????? – 2012-01-30 22:00:39

+0

在你的过滤器中,你使用了一些像'B.rooms_id'这样的列,但是我没有在你的'FROM'上看到表B' – Lamak 2012-01-30 22:03:49

+0

感谢你接受Lamark。查询已更新为正确的值。 至于我的问题,它是这个查询从PL/SQL转换为T-SQL。 – user1179071 2012-01-30 22:11:02

回答

1

好吧,试试这个查询:

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 2012-01-30 22:30:31

+0

我认为这可能有用!非常感谢你! – user1179071 2012-01-30 22:34:41

+0

我认为Oracle'NVL(trim(e.event_title),'')'也会将任何只有空格的字符串转换为一个空格字符串:''''(由于运行不正常Oracle中的空字符串)。根据空字符串和NULL字符串的处理方式,这可能需要或可能不需要特别注意SQL-Server。 – 2012-01-30 22:37:12

2

这是你的Oracle代码作为SQL小提琴:http://sqlfiddle.com/#!4/80d20/4

而这里的修改版本的SQL Server: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' 

编辑用ltrim加入rtrim

+1

仅供参考 - http://sqlfiddle.com是我的网站 – 2012-01-30 22:39:33

+0

感谢您的查询并指向我这个网站。非常感激! – user1179071 2012-01-31 20:39:52

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