2012-02-09 189 views
2

私は本当にこれに困惑しています!私はそれがシンプルだが、本当にそれを理解することはできないと確信しています!T-SQL IF文の説明

DECLARE @jobid INT = 100 
    IF (@JobID >= 0) 
BEGIN 
SELECT * into #tmp FROM Persons 
end 
    ELSE 
BEGIN 
SELECT * into #tmp FROM Persons1 
end 

#tmpテーブルが既に存在するというエラーが表示されます。なぜそれが両方の声明を検証するのだろう!

もちろん、元のクエリは膨大で、それ以上は行っていますが、それは私のエラーを説明するためのサンプルです。

誰でも説明できますか?

#tmpテーブルを削除したり名前を変更しようとしても、エンジンは両方のステートメントを検証します。

私は2008 R2を使用しています。リンクサーバー上でそれを実行

おかげ ジェイソン

+6

「あなたは '落ちていない原因:あなたは前にそのブロックにどこでもあなたのクエリで#tmpを使用していない場合、あなたはそれが常に移動する準備ができます確保するために、以下の前のコードのそのブロックのような何かを行うことができます#tmp'を前回実行しましたか? –

+0

「ELSE」の後に「BEGIN」が必要ないとはかなり確信しています。また、MSDN ELSEによると、ENDの後に来る必要がありますか? http://msdn.microsoft.com/en-us/library/ms182717.aspx –

+0

@ p.campbell - そうではありません。コードを試してみると、ランタイムではなくエラーを発生させるパーサーであることがわかります。エラーメッセージはほとんど同じです。パーサーエラーは 'Msg 2714、Level 16、State 1'を返し、ランタイムエラーは' Msg 2714、Level 16、State 6'を返します。 –

答えて

2

または以前の実行で削除されていません。前IFステートメントに#tmpテーブルを作成するための

試してみてください。

CREATE TABLE #tmp(fields...) 

DECLARE @jobid INT = 100 
IF (@JobID >= 0) 
BEGIN 
    INSERT #tmp 
    SELECT * FROM Persons 
end 
ELSE 
BEGIN 
    INSERT #Tmp 
    SELECT * FROM Persons1 
end 

または provious 1

IF OBJECT_ID('tempdb..#tmp') IS NOT NULL 
    EXEC('DROP TABLE #tmp') 
GO 

DECLARE @jobid INT = 100 
    IF (@JobID >= 0) 
BEGIN 
SELECT * into #tmp FROM Persons 
end 
    ELSE 
BEGIN 
SELECT * into #tmp FROM Persons1 
end 
+0

ありがとうOleg、いいえ、それはローカルに接続されていませんが、テーブルは存在しません。なぜそれがスローされるのか理解しようとしていますそのエラーはIF OBJECT_ID( '#tmp')がNULLではない DROP TABLE #tmp GO – JYousef

+0

したがって、それより先に作成し、更新された2番目のステートメントを参照してください。 –

+1

IF OBJECT_ID( 'tempDB')をチェックする必要があります。 。#tmp ')IS NOT NULL' @diahoが書きました。 –

2

#tmpを削除するには、すでにあなたのクエリの以前の実行からtempDBに作成することができます。

IF OBJECT_ID('tempDB..#tmp') IS NOT NULL 
    DROP TABLE #tmp 
+0

あなたの返事をありがとう...しかし、それを信じていない、それはない...他の名前を試しても、同じエラーが発生する!! – JYousef

+0

あなたは正しいです@ JYousef。エラーのGoogle検索(Msg 2714、レベル16 ...データベースに '#tmp'という名前のオブジェクトが既にあります)は、一時テーブルの制限があることを示しています。'Persons'と' Persons1'のスキーマは同じですか?もしそうなら、@Olegが推奨する最初の解決策をお勧めします。 – diaho

+0

ありがとう、私は@Olegのような最初の方法を使用しているが、なぜそれが検証してそのエラーを与えるのか困惑していた!!あなたのすべての協力に感謝します。 – JYousef