2016-09-19 124 views
2

我想檢查CTE表是否有記錄或爲空。但是對於下面的SQL,我總是會在關鍵字「IF」附近收到錯誤消息「語法錯誤」。現在ADMISSION_OUTSIDE TABLE中沒有匹配的記錄。 SQl的結果應該打印「NOT OK」。謝謝,在CTE中使用IF EXISTS

WITH ADMISSION_OUTSIDE AS 
( ..... 
..... 
) 

IF EXISTS (SELECT * FROM ADMISSION_OUTSIDE) 
PRINT 'OK' 
ELSE PRINT 'NOT OK' 
+8

的CTE應遵循'SELECT,INSERT,UPDATE或DELETE'陳述 –

+0

也許你在這裏做一些混淆。這不是相關的語法,也不是CTE的相應用法。也許你只是想把你的CTE中的查詢內容放在表變量中。請注意,在CTE定義之後的命令之後,您沒有範圍內的CTE – jean

+0

您是否正在打印以調試查詢?還是你打算也從中選擇數據? –

回答

7

MSDN

的CTE必須跟一個SELECT,INSERT,UPDATE或DELETE 聲明引用部分或全部CTE列

它可以像這樣重寫

WITH ADMISSION_OUTSIDE AS 
( ..... 
..... 
) 
SELECT 'OK' WHERE EXISTS (SELECT * FROM ADMISSION_OUTSIDE) 
UNION ALL 
SELECT 'NOT OK' WHERE NOT EXISTS (SELECT * FROM ADMISSION_OUTSIDE) 

這裏是一個演示

;WITH CTE AS 
(
SELECT 1 as a WHERE 1=0 
) 
SELECT 'OK' WHERE EXISTS (SELECT * FROM CTE) 
UNION ALL 
SELECT 'NOT OK' WHERE NOT EXISTS (SELECT * FROM CTE) 

結果:NOT OK

;WITH CTE AS 
(
SELECT 1 as a WHERE 1=1 
) 
SELECT 'OK' WHERE EXISTS (SELECT * FROM CTE) 
UNION ALL 
SELECT 'NOT OK' WHERE NOT EXISTS (SELECT * FROM CTE) 

結果:OK

+0

我得到空白值。 – Ice

+0

@Ice - 增加演示也 –

+0

它的工作。謝謝。 – Ice

3

我想這也是檢查的價值存在和執行操作一個最簡單的方法。

WITH ADMISSION_OUTSIDE AS 
( ..... 
..... 
) 
SELECT CASE WHEN (SELECT COUNT(1) tot 
        FROM ADMISSION_OUTSIDE) > 0 THEN 'OK' ELSE 'NOT OK' END 
+0

謝謝。有用。 – Ice

+0

EXISTS在找到匹配項時將停止讀取數據。COUNT將讀取與謂詞相對應的所有行。一般而言,EXISTS更高效。 –

+0

你認爲它不適合'檢查CTE表是否有記錄或空'嗎? – Susang

0

有點哈克但你可以做這樣的事情: 聲明@x位

;WITH CTE AS 
(
    SELECT 1 As 'column1' 
) 
SELECT @x = ISNULL(column1,0) from cte 

If @x=1 
begin 
... 
end