我有一个问题,我有两个可能包含所需数据的表。我已经使用临时表和一个if-else if
来解决这个问题,该表从适当的表中填充了临时表:
IF EXISTS (SELECT * FROM sys.tables WHERE [name] = "table1") BEGIN
--Fill temp table.
END ELSE BEGIN
IF EXISTS (SELECT * FROM sys.tables WHERE [name] = "table2") BEGIN
-- Fill temp table.
END
END
只要table1
不存在,此方法就很好用。但是,我发现旧表仍然存在并且不包含任何数据,因此导致查询不返回正确结果的问题。
我已经找到一种解决方法;但是,这仅在表存在的情况下有效,如果表不存在(存在这种情况),则查询将不会执行:
IF EXISTS(SELECT * FROM sys.tables WHERE [name] = "table1") AND
(SELECT COUNT(*) FROM table1) > 0 BEGIN
-- Fill temp table.
END
如何获取可能存在或不存在的表的行数?
其他有用的注释 :我正在使用SSMS 2016
。
好的建议 :一位同行用户说我应该尝试EXEC
;如果需要,我非常愿意走这条路。我们的IA家伙不太喜欢这种方法,为了使他感到高兴,还必须进行其他验证,但是快速而肮脏的版本是:
DECLARE @CMD NVARCHAR(MAX) = N'IF EXISTS(SELECT * FROM sys.tables WHERE [name] = "table1") AND
(SELECT COUNT(*) FROM table1) > 0 BEGIN
-- Fill temp table.
END'
EXEC sp_executesql @CMD;
另一种很好的尝试是先验证新表的存在并对其进行优先级排序,但是这并不能回答本文后面的问题;但对于情况类似的人也可以:
IF EXISTS (SELECT * FROM sys.tables WHERE [name] = "table2") BEGIN
--Fill temp table.
END ELSE BEGIN
IF EXISTS (SELECT * FROM sys.tables WHERE [name] = "table1") BEGIN
-- Fill temp table.
END
END
答案 0 :(得分:2)
事实证明,您也可以从sys.tables查询行数:
IF EXISTS(SELECT * FROM sys.tables WHERE [name] = 'table1'
AND OBJECTPROPERTYEX([object_id], 'Cardinality') > 0)
此方法和一些替代方法在the SQLAuthority blog上。
答案 1 :(得分:1)
如果您要解决此问题,只需拆分IF
IF EXISTS(SELECT * FROM sys.tables WHERE [name] = 'table1')
BEGIN
IF (SELECT COUNT(*) FROM table1) > 0
BEGIN
-- Fill temp table.
END
END