7

シナリオパラメータの値に依存する一時テーブルを作成しようとしていますが、次のIFステートメントを使用していますが、以下のエラーが発生します。

    IF @indexName = 'A'
        begin select top 400 * into #temp from #pretemp order by EMRev desc end
    ELSE IF @indexName = 'B'
        begin select top 75 * into #temp from #pretemp order by EMRev desc end
    ELSE IF @indexName = 'C'
        begin select top 300 * into #temp from #pretemp order by EMRev desc end
    ELSE 
        begin select top 100 * into #temp from #pretemp order by EMRev desc end

メッセージ2714、レベル16、状態1、行179データベースにはすでに「#temp」という名前のオブジェクトがあります。メッセージ2714、レベル16、状態1、行181データベースにはすでに「#temp」という名前のオブジェクトがあります。メッセージ2714、レベル16、状態1、行183データベースにはすでに「#temp」という名前のオブジェクトがあります。

IFステートメントは@indexName変数に基づいて機能すると確信しています(ブロックステートメントを単純なもの(たとえば、'select @indexName')に置き換えると、プログラムは正常に実行されます)。

このエラーの原因について何か考えはありますか?

4

2 に答える 2

12

SQL パーサーは、一時テーブルを作成する可能性のあるすべての場所を探し、特定の一時テーブル名の使用を 1 回だけ許可します。解決策は、次のようなことです。

select * into #temp from #pretemp where 1=2

IF @indexName = 'A'
    begin insert into #temp select top 400 * from #pretemp order by EMRev desc end
ELSE IF @indexName = 'B'
    begin insert into #temp select top 75 * from #pretemp order by EMRev desc end
ELSE IF @indexName = 'C'
    begin insert into #temp select top 300 * from #pretemp order by EMRev desc end
ELSE 
    begin insert into #temp select top 100 * from #pretemp order by EMRev desc end

where 1=2レコードがゼロのテーブル構造を作成します...次に、ifステートメントが一時テーブルにデータを入力します。

乾杯!

于 2012-06-28T23:58:39.797 に答える
4

上位のレコード数だけが違いますので。あなたはこれを試すことができます

declare @num int 

SET @num = CASE @indexName 
                    WHEN 'A' THEN 400
                    WHEN 'B' THEN 75
                    WHEN 'C' THEN 300
                    ELSE  100
            END

select top (@num) * into #temp from #pretemp order by EMRev desc
于 2012-06-29T13:13:24.357 に答える