2014-01-16 3 views
0

У меня есть хранимая процедура, которая извлекает данные из 2 отличаются на 2 разных серверах следующим образом:SQL IF в хранимой процедуре

SELECT 
     LocalDB.Record_ID, 
     LocalDB.Total/1440 as TotalTime, 
     ((REMOTE_ACTIVE.Time_Adjusted) - (REMOTE_ACTIVETimes.CALCTimeSec)) as TimeLeft, 
     LocalDB.isManualEntry 
     FROM LocalDatabase.dbo.Records LocalDB left join 
        [RemoteServer].[Reporting].[dbo].[ActiveWO] REMOTE_ACTIVE ON 
        LocalDB.WO_ID = REMOTE_ACTIVE.[PO_ID] 
        left join [RemoteServer].[Reporting].[dbo].[ActiveWOTimes] REMOTE_ACTIVETimes ON 
      LocalDB.WO_ID = REMOTE_ACTIVETimes.[PO_ID] 

Что может случиться, что иногда значение «TimeLeft» может быть 0. Когда это случается, что я хочу, чтобы заменить это значение с чем-то вроде

IF(TimeLeft is 0 or null) 
(getdate() - LocalDB.CreatedDate) as TimeElapsed 

дело в том, что я не знаю, как реализовать такое заявление IF или, если это вообще возможно.

+0

вы можете использовать регистр case в sql serve r. Пожалуйста, обратитесь к http://stackoverflow.com/questions/5487892/sql-server-case-when-or-then-else-end-the-or-is-not-supported – Pawan

+0

Спасибо, но это не показывает полный синтаксис, например, куда идет CASE. –

ответ

2

Просто добавьте case заявление:

SELECT LocalDB.Record_ID, 
     LocalDB.Total/1440 as TotalTime, 
     (case when REMOTE_ACTIVE.Time_Adjusted - REMOTE_ACTIVETimes.CALCTimeSec <> 0 
      then REMOTE_ACTIVE.Time_Adjusted - REMOTE_ACTIVETimes.CALCTimeSec 
      else getdate() - LocalDB.CreatedDate 
     end) as TimeLeft, 
     LocalDB.isManualEntry 
FROM LocalDatabase.dbo.Records LocalDB left join 
    [RemoteServer].[Reporting].[dbo].[ActiveWO] REMOTE_ACTIVE 
    ON LocalDB.WO_ID = REMOTE_ACTIVE.[PO_ID] left join 
    [RemoteServer].[Reporting].[dbo].[ActiveWOTimes] REMOTE_ACTIVETimes 
    ON LocalDB.WO_ID = REMOTE_ACTIVETimes.[PO_ID]; 

Я предполагаю, что в этом вопросе, что TimeElapsed является заменой для TimeLeft.

+0

Спасибо, что сделал эту работу. Запрос, кажется, занимает немного больше времени, будет ли это из-за запроса или из-за или латентности? –

+0

@sd_dracula. , , Я серьезно сомневаюсь, что добавление этого оператора case приведет к значительному влиянию на производительность. Я подозреваю, что это просто естественные вариации, основанные на том, что работает на сервере, и как данные хранятся в различных кэшах страниц. –

0

Вы можете использовать подзапрос

Select RecordID,TotalTime,TimeLeft,IsManualEntry, 
     CASE WHEN TimeLeft=0 OR TimeLeft is null THEN DATEDIFF(day, GETDATE(), CreationDate) 
      ELSE CreationDate END AS TimeElapsed, 

FROM (
     SELECT LocalDB.CreatedDate As CreationDate 
     LocalDB.Record_ID as RecordID, 
     LocalDB.Total/1440 as TotalTime, 
     ((REMOTE_ACTIVE.Time_Adjusted) - (REMOTE_ACTIVETimes.CALCTimeSec)) as TimeLeft, 
     LocalDB.isManualEntry as IsManualEntry 
     FROM LocalDatabase.dbo.Records LocalDB left join 
        [RemoteServer].[Reporting].[dbo].[ActiveWO] REMOTE_ACTIVE ON 
        LocalDB.WO_ID = REMOTE_ACTIVE.[PO_ID] 
        left join [RemoteServer].[Reporting].[dbo].[ActiveWOTimes] 
        REMOTE_ACTIVETimes ON 
        LocalDB.WO_ID = REMOTE_ACTIVETimes.[PO_ID] 
    ) Z 

Подробнее о DATEDIFF

Смежные вопросы