L Server '' drop table command [duplica
-
30-09-2020 - |
質問
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> u003Cp>データベースに「#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> u003Cp> 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