質問

3Cdiv> u00e> n n.u003C/di

3Cp>私は、Microsoft SQL Management Studioを使用して作成してテストしている500以上の行を保存しています。今日私は次の「奇妙な」ケースに遭遇します。私のクエリ(疑似コード)は次のようになりますu003C/

create table #TempTable1 (Name varchar(30))

-- Some queries involving #TempTable1

drop table #TempTable1

-- Some queries

declare MyCursor cursor fast_forward for 
select ......

open MyCursor

fetch next from MyCursor into @CursorValue
while @@fetch_status = 0
   begin

       create table #TempTable1 (Name varchar(30))

       -- Some queries involving #TempTable1

       drop table #TempTable1 

       fetch next from MyCursor into @CursorValue

    end

close MyCursor 
deallocate MyCursor 

3Cp>私のクエリは2番目のcreate tableのエラーで失敗しますu003C/

3Cblockquote> u00

3Cp>データベースに「#temptable1」という名前のオブジェクトがあります。u003C/

p> u003C/blockquot

3Cp>クエリの最適化のため、コマンドがそれらを入力しているシーケンスで実行されていないことを知っています。しかし、このエラーはまだ私には奇妙なようです。私は実行を強制するためにgoのコマンドをいくつか置くことができますが、私のコードで他の問題を生み出すことができます。それで、それは「実際の問題」よりも「心の正解」です。u003C/

3Cp>これがなぜ起こっているのか、そしてどのようにそれを避けることができるかについての提案は何ですか?u003C/

役に立ちましたか?

解決

3Cp>同じ名前で誘惑を作成しているのを見ることができます。単一のクエリまたはバッチで同じ名前のTempテーブルを作成できません。これはBOLドキュメントに従って文書化されています。 3Ca href="https://technet.microsoft.com/en-us/library/ms174979(v=sql.100).aspx" rel="nofollow">BOL文書u003C/年からu003C/

3Cblockquote> u00

3Cp> 1つのストアドプロシージャまたはバッチ内で複数の一時テーブルが作成されている場合、それらは異なる名前を持つ必要があります。u003C/

p> u003C/blockquot

3Cp>下のロジックを使用する必要があります。u003C/

IF OBJECT_ID('tempdb..#Temptable1') IS NOT NULL

   DROP TABLE #Temptable1

CREATE TABLE #Temptable1(name nvarchar(30))  

3Cp>それはあなたのクエリを作るでしょうu003C/

IF OBJECT_ID('tempdb..#Temptable1') IS NOT NULL

       DROP TABLE #Temptable1

    CREATE TABLE #Temptable1(name nvarchar(30))

-- Some queries involving #TempTable1

   IF OBJECT_ID('tempdb..#Temptable1') IS NOT NULL

       DROP TABLE #Temptable1



-- Some queries

declare MyCursor cursor fast_forward for 
select ......

open MyCursor

fetch next from MyCursor into @CursorValue
while @@fetch_status = 0
   begin

          IF OBJECT_ID('tempdb..#Temptable2') IS NOT NULL--new temp table

       DROP TABLE #Temptable2

    CREATE TABLE #Temptable1(name nvarchar(30))

       -- Some queries involving #TempTable1

        IF OBJECT_ID('tempdb..#Temptable2') IS NOT NULL

       DROP TABLE #Temptable2

       fetch next from MyCursor into @CursorValue

    end

close MyCursor 
deallocate MyCursor 
ライセンス: CC-BY-SA帰属
所属していません dba.stackexchange
scroll top