我试着这样做:如何检查表存在,它不是空在一个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将返回一个错误,因为它仍然尝试检查第二种情况,即使“和”条件的第一面已经失败。
感谢您的帮助!
我试着这样做:如何检查表存在,它不是空在一个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将返回一个错误,因为它仍然尝试检查第二种情况,即使“和”条件的第一面已经失败。
感谢您的帮助!
不幸的是这是不可能的。 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
此查询解决了我的问题,谢谢! – 2013-02-27 08:17:15
这永远是最终目标,不是吗?很高兴我能帮上忙! – pyrospade 2013-02-27 08:25:58
您不应该强制执行此操作。它可以通过多种方式完成,无需使用Try Catch来改变程序的流程。 – 2017-11-15 19:08:01
只要写:
IF OBJECT_ID('a_b_Stage2_supA_demB') is not null
IF select COUNT(*) from a_b_Stage2_supA_demB > 0
.....
问题是,我需要他们做同样的事情时,每一个是“假”: 如果object_id为空做a,b,c,d ... 如果object_id不为null但count(*)= 0做一个,B,C,D .... – 2013-02-27 05:45:10
虽然这个工程,@MichaelCherevko将不得不实施两次假条件。此外,可能更好使用'if exists(select * from table)' – pyrospade 2013-02-27 06:13:41
IF OBJECT_ID('dept') is not NULL
BEGIN
IF exists(SELECT 1 FROM dept)
PRINT 'exists with rows'
END
同样的问题,在第一个答案。 – 2013-02-27 07:34:35
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)
.....
凭什么你说,第二个条件检查,即使第一次一个已经失败了? – praveen 2013-02-27 05:21:22
因为试图从a_b_Stage2_supA_demB 在不存在的表1的条件进行 SELECT COUNT(*)当SQL返回错误失败,但第二个条件 引起的问题。 – 2013-02-27 05:27:12