2013-02-27 19 views
3

我试着这样做:如何检查表存在,它不是空在一个IF

if OBJECT_ID('a_b_Stage2_supA_demB') is not null 
and (select COUNT(*) from a_b_Stage2_supA_demB) > 0 

但当a_b_Stage2_supA_demB不存在SQL Server将返回一个错误,因为它仍然尝试检查第二种情况,即使“和”条件的第一面已经失败。

感谢您的帮助!

+0

凭什么你说,第二个条件检查,即使第一次一个已经失败了? – praveen 2013-02-27 05:21:22

+0

因为试图从a_b_Stage2_supA_demB 在不存在的表1的条件进行 SELECT COUNT(*)当SQL返回错误失败,但第二个条件 引起的问题。 – 2013-02-27 05:27:12

回答

1

不幸的是这是不可能的。 SQL Server将检查以确保在编译之前存在所有对象引用(在基本代码路径内)。如果没有陈述,怎么样?

begin try 
    exec('declare @x int = (
       select 1/COUNT(*) 
       from a_b_Stage2_supA_demB)'); 
    print 'true'; 
end try 
begin catch 
    print 'false'; 
end catch 
+0

此查询解决了我的问题,谢谢! – 2013-02-27 08:17:15

+0

这永远是最终目标,不是吗?很高兴我能帮上忙! – pyrospade 2013-02-27 08:25:58

+0

您不应该强制执行此操作。它可以通过多种方式完成,无需使用Try Catch来改变程序的流程。 – 2017-11-15 19:08:01

0

只要写:

IF OBJECT_ID('a_b_Stage2_supA_demB') is not null 
    IF select COUNT(*) from a_b_Stage2_supA_demB > 0 
     ..... 
+0

问题是,我需要他们做同样的事情时,每一个是“假”: 如果object_id为空做a,b,c,d ... 如果object_id不为null但count(*)= 0做一个,B,C,D .... – 2013-02-27 05:45:10

+0

虽然这个工程,@MichaelCherevko将不得不实施两次假条件。此外,可能更好使用'if exists(select * from table)' – pyrospade 2013-02-27 06:13:41

0
IF OBJECT_ID('dept') is not NULL 
BEGIN 
IF exists(SELECT 1 FROM dept) 
PRINT 'exists with rows' 
END 
+0

同样的问题,在第一个答案。 – 2013-02-27 07:34:35

1

DMV的可以轻松解决你的问题:

IF EXISTS (select * from sys.tables t 
    INNER JOIN sys.partitions p on t.object_id = p.object_id 
    WHERE t.name = 'a_b_Stage2_supA_demB' and p.rows > 0) 
..... 
相关问题