2012-03-29 37 views
0

我正在嘗試在我的查詢中添加功能,以選擇在特定條件下執行哪個查詢。當查詢條件中的條件不成立時,CTE不工作

DECLARE @Test VARCHAR(50) 
    SET @Test = 'A' 

;WITH A AS (
    Select 'A is Selected' as SELECTED), 
     B AS (
    Select 'B is Selected' as SELECTED) 

IF(@Test = 'A') 
    select * from A 

IF(@Test <> 'A') 
    select * from B 

由於上述我我的樣品測試代碼有:

消息319,15級,狀態1,5號線
'與' 關鍵字附近有語法錯誤。如果此語句是公用表表達式或xmlnamespaces子句,則前面的語句必須以分號結尾。

Msg 102,Level 15,State 1,Line 8
','附近的語法不正確。

也許我錯過了什麼?

+1

CTE的附加到SELECT,INSERT,UPDATE或DELETE語句 - 您的示例沒有這些。有條件的邏輯不計算... – 2012-03-29 03:38:41

+0

要獲得最佳答案,您應該發佈生成錯誤的代碼。這會給你在關鍵字'IF'附近有不正確的語法。'# – 2012-03-29 05:37:31

回答

4

WITH common_table_expression (Transact-SQL)

定義在單個SELECT,INSERT,UPDATE, 或DELETE語句的執行範圍內。

我想你想要這樣的東西。

declare @Test varchar(50); 
set @Test='A'; 

with A as 
(
    select 'A is Selected' as SELECTED 
), 
B as 
(
    select 'B is Selected' as SELECTED 
) 
select * 
from A 
where @Test = 'A'  
union all 
select * 
from B 
where @Test = 'B'; 
+0

因此,如果存在CTE,那麼它不可能使用IF函數? – BizApps 2012-03-30 00:01:43

+0

@BizApps你不能在查詢中使用iF。您可以使用IF來控制應執行的查詢,但CTE是ONE查詢的一部分,因此您不能使用IF來控制要使用的CTE。 – 2012-03-30 04:02:35

1

在我看來,你應該簡單地把兩個查詢的IF語句中,如下所示:

IF (@Test = 'A') 
    select * from A 
ELSE 
    select * from B 
+0

其實,你** CAN **有多個CTE定義,用逗號分隔 - 這絕對是**不是**問題! – 2012-03-29 05:08:31

+0

我想我只是沒有看到需要像那樣加入他們。 – datagod 2012-03-29 05:10:57