0

すでにコードの一部になっているものを見落としており、この状況は必要ないため、この問題を解決しました。

SQL Server 2008 には、2 つの IF ステートメントがあります。

If value = ''
begin 
select * into #temptable from table 1
end
Else If value <> ''
begin 
select * into #temptable from table 2
end

しかし、実行しようとすると、2番目の理由で私に与えられます

魅力的:

There is already an object named '#temptable' in the database.

アフターコードを大幅に変更する必要があるため、別の一時テーブル名を使用したくありません。これをバイパスする方法はありますか?

4

3 に答える 3

2

コードをもう少し保守しやすくするために、いくつかの変更を加えることをお勧めします。ここでの設定方法に関する問題の1つは、SELECT *使用している構文にあります。後でtable1またはtable2のスキーマに変更を加えることにした場合、明らかでない結果が生じる可能性があります。本番コードでは、使用している列と場所が明確になるように、これらのことを詳しく説明することをお勧めします。

また、次のコードで表1と表2のすべての列を実際に使用していますか?必要以上のデータをロードしてパフォーマンスが低下している可能性があります。#temptableを使用するコードを調べて、実際に使用している列を特定します。次に、一時テーブルを作成することから始めます。

CREATE TABLE #temptable(col1 int, col2 int, col3 int, col4 int)

一部の列が特定の場合にnullになる可能性がある場合でも、使用できる可能性のあるすべての列を含めます。おそらく、次のコードはすでにそれを理解しています。次に、IFステートメントを設定できます。

IF value = ''
BEGIN 
    INSERT INTO #temptable(col1, col2, col3)
    SELECT x,y,z
    FROM table1
END

ELSE
    INSERT INTO #temptable(col1, col4)
    SELECT alpha,beta
    FROM table2
END
于 2013-02-11T19:53:08.773 に答える
0

あなたの SELECT ステートメントは、書かれているように、一時テーブルを作成し、それに INSERTING をすべて 1 つのステートメントで実行しています。CREATE TABLE ステートメントを使用して一時テーブルを個別に作成し、次に 2 つの IF ステートメントで INSERT INTO を作成します。

于 2013-02-11T19:36:20.857 に答える
0

SELECT INTOご存じのとおり、使用するとその場でテーブルが作成されます。クエリ#temptableが 1 回しか参照されていなくても、(最初の実行後にテーブルを削除せずに) 複数回実行すると、同じエラーが発生します (ただし、ストアド プロシージャ内にある場合は、おそらくストアド プロシージャのスコープ)。

ただし、このクエリをコンパイルすることさえできません。Ctrl+F5たとえば、次のクエリで解析コマンド ( ) を使用すると、同じテーブルがソース テーブルとして使用されていても失敗します。

select * into #temptable from SourceTable
select * into #temptable from SourceTable

テーブル 1 とテーブル 2 の構造が同じであれば、次のようなことができます。

select * into #temptable from
    (select * from Table1 where @value = ''
    union
    select * from Table2 where @value <> '') as T

ただし、テーブルの構造が異なる場合は、 agtD. Lambertが推奨する以外に、何ができるかわかりません。

于 2013-02-12T01:30:56.983 に答える