如何获取可能不存在的表的行数?

时间:2018-08-14 15:54:14

标签: sql

我有一个问题,我有两个可能包含所需数据的表。我已经使用临时表和一个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

2 个答案:

答案 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