使用IF EXISTS和CTE

时间:2016-09-19 15:26:17

标签: sql sql-server

我想检查CTE表是否有记录或null。但我总是收到错误信息'关键字'IF'附近的SQL语法错误,如下面的SQL。现在ADMISSION_OUTSIDE TABLE中没有匹配的记录。 SQl的结果应该打印'NOT OK'。谢谢,

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

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

5 个答案:

答案 0 :(得分:12)

来自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

答案 1 :(得分:6)

我认为这也是检查价值存在并执行操作的最简单方法。

if (model.Name != null)
{
    sb.AppendLine("<tr><td"><strong>Name: </strong></td><td>" + model.Name + "</td></tr>");
}

答案 2 :(得分:1)

有点hacky但你可以做这样的事情:

declare @x bit

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

If @x=1
begin
...
end

答案 3 :(得分:0)

因为必须使用声明结果后跟声明。除了结果不允许之外的任何其他声明。

请参阅更多信息:Unable to Drop a table after a WITH statement

答案 4 :(得分:0)

SQL Server返回该错误消息(&#34;语法错误&#34;),因为它不是有效的语句。

公用表表达式(CTE)本身不是一个单独的语句。它是表达式,它是另一个语句的一部分,可以是SELECT,INSERT,UPDATE,DELETE或CREATE VIEW语句。

https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx