2014-01-16 151 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

你可以在sql serve r中使用case語句。請參閱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