2012-12-18 27 views
0

我不知道爲什麼下面的子查詢不SQL Server中工作,當我在自己獨立運行子查詢早點工作得很好,但我添加如果使用其他SQL Server中的子查詢

Select * from ([subquery]) as table1 

查詢不運行,SQL Server返回一個錯誤,說我在關鍵字'if'附近有不正確的語法,這裏存在什麼語法錯誤,以及如何才能正常工作呢?

任何指針?

select * from (

    if datepart(MONTH, getdate()) >= MONTH('1/February/0000') 
    --after february we want the next years semesters, 

     begin 
     select top 3 sem_name from semester_dates 
     where datepart(year, start_date) < datepart(YEAR, getdate()) and sem_name not like 'summer%' 
     end 

    else 
     begin 
     select top 3 sem_name from semester_dates sd 
     where datepart(year, start_date) >= datepart(YEAR, getdate()) and sem_name not like 'summer%' 
     end 

    ) table1 
+1

在這樣的查詢中你不能有一個'if',這個代碼在存儲過程中嗎?或者你在哪裏執行它? – Taryn

+0

@bluefeet是的,這是在一個存儲過程...所以我的替代方案是什麼呢? – DaneEdw

+2

你有什麼不是子查詢。儘管如此,你也可以將它轉換爲表值函數。 – BStateham

回答

3

您可能需要考慮將if/else邏輯移動到表值函數中。也許是這樣的。請注意,我沒有檢查你的邏輯,我只是​​重新使用了這個。您可能需要相應地調整以下代碼:

CREATE FUNCTION SemesterNames 
(
    @ReferenceDate datetime 
) 
RETURNS @dates table 
(
    sem_name nvarchar(50) --check the data type 
) 
AS 
BEGIN 
    if datepart(MONTH, @ReferenceDate) >= MONTH('1/February/0000') 
    --after february we want the next years semesters, 
    INSERT INTO @dates (sem_name) 
    select top 3 sem_name from semester_dates 
    where datepart(year, start_date) > datepart(YEAR, @ReferenceDate) and sem_name not like 'summer%' 
    end 
else 
    INSERT INTO @dates (sem_name) 
    select top 3 sem_name from semester_dates sd 
    where datepart(year, start_date) >= datepart(YEAR, @ReferenceDate) and sem_name not like 'summer%' 
END; 
GO 

SELECT * FROM SemesterNames(GETDATE()); 
+0

任何理由使它成爲表值的函數,而不僅僅是一個臨時表變量? DECLARE @SemesterNames TABLE(...? – danfolkes

0

如果/ else結構不應該工作到Select查詢。

1

請使用CASE而不是IF來嘗試以下操作。

SELECT * 
FROM 
(SELECT 
    CASE 
     WHEN datepart(MONTH, getdate()) >= MONTH('1/February/0000') 
      THEN 
       (SELECT TOP 3 sem_name 
       FROM semester_dates 
       WHERE datepart(year, start_date) > datepart(YEAR, getdate()) and sem_name not like 'summer%') 
     ELSE 
       (SELECT TOP sem_name 
       FROM semester_dates 
       WHERE datepart(year, start_date) >= datepart(YEAR, getdate()) and sem_name not like 'summer%') 
) 
0

對於這個特定的查詢,你能不能用一個單一的選擇與WHERE子句中的條件二月的acheive期望的結果?

SELECT TOP 3 
    Sem_Name 
FROM 
    semester_dates 
WHERE 
    sem_name not like 'summer%' 
    and 
    (
     (datepart(month, getdate()) >= 2 AND datepart(year, start_date) < datepart(YEAR, getdate())) 
     OR 
     (datepart(month, getdate()) < 2 AND datepart(year, start_date) >= datepart(YEAR, getdate())) 
    ) 
1

至於我可以看到你的條件邏輯的唯一影響是日期部分(年,起始日期)是嚴格大於或大於或等於。所以,你可以像這樣只是一個簡單的查詢替換整個事情:

select top 3 sem_name from semester_dates 
    where datepart(year, start_date) >= datepart(YEAR, getdate()) 
    and sem_name not like 'summer%' 
    and (
     datepart(MONTH, getdate()) > MONTH('1/February/0000') or 
     datepart(year, start_date) = datepart(YEAR, getdate() 
    ) 

換句話說,起始日期的年份是嚴格>年(GETDATE()),除非,如果月份>二月,那麼年可以等於它。

相關問題