如果存在,则查询一个表

时间:2012-09-14 15:48:16

标签: sql sql-server sql-server-2005

我正在使用SQL 2005,并且具有以下代码:

DECLARE @exist4 INT
IF ( SELECT COUNT(*) existe
     FROM   sysobjects obj
     WHERE  obj.name = 'table4'
   ) > 0 
    BEGIN 
        SET @exist4 = 1
    END
ELSE 
    BEGIN 
        SET @exist4 = 0
    END

/*now if table4 exist i need add to my query but if i do something as it
i got next error
Invalid object name 'table4'.*/


IF ( @exist4 = 0 ) 
    BEGIN

        SELECT  [table].col1 ,
                [table].col2 ,
                [table].col3 ,
                [table].colN
        FROM    [table] ,
                table2 ,
                table3
        WHERE   [table].id = table1.id
                AND table3.id = table2.id
    END
ELSE 
    BEGIN
        SELECT  [table].col1 ,
                [table].col2 ,
                [table].col3 ,
                [table].colN
        FROM    [table] ,
                table2 ,
                table3 ,
                table4
        WHERE   [table].id = table2.id
                AND table3.id = table2.id
                AND table4.id = table3.id
    END

当Table4不存在时,此代码返回错误。如何才能使此查询生效?

2 个答案:

答案 0 :(得分:0)

发生的事情是在解析查询时table4不存在。这意味着您无法运行查询。

您需要做的是延迟解析该部分查询,直到您知道table4存在。

您可以通过将查询放在字符串中然后运行存储过程sp_excutesql来完成此操作。像这样:

 DECLARE @myQueryString NVARCHAR(4000);
 SET @myQueryString = N'select table.col1, table.col2, table.col3, table.colN into #tmp
     from table,table2,table3,table4
     where table.id=table2.table1id 
     and table3.table2id=table2.id
     and table4.table3id=table3id';
 EXEC sp_executesql @myQueryString;

引用table4的查询部分仅在第一次解析整个查询时才可用作字符串,因此解析器只能看到一个字符串,而不是对各个表的引用。运行sp_executesql时,将解析并运行该字符串。因为你将它放在你的IF块中,它只会在知道table4存在时解析并运行。

答案 1 :(得分:0)

优化器可能正在尝试评估select语句语法,因此请将其包装在sp_executesql语句中以延迟该语法。尝试:

    IF ( SELECT OBJECT_ID('SQLInstances')
   ) IS NOT NULL 
    BEGIN 
        EXEC sp_executesql @statement = N'select table1.col1, table1.col2, table1.col3, table1.colN into #tmp from table1,table2,table3
where table1.id=table2.table1id 
and table3.table2id=table2.id'
    END
ELSE 
    BEGIN 
        EXEC sp_executesql @statement = N'select table1.col1, table1.col2, table1.col3, table1.colN into #tmp from table1,table2,table3,table4
where table1.id=table2.table1id 
and table3.table2id=table2.id
and table4.table3id=table3id'
    END