0

私はSQL2005を使用しており、次のコードを使用しています。

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 に答える