0

我正在使用 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 不存在时,此代码返回错误。我怎样才能让这个查询工作?

4

2 回答 2

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 存在时解析和运行。

于 2012-09-14T15:55:55.590 回答
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
于 2012-09-14T16:01:52.110 回答