2016-06-16 7 views
3

私は、次のSQLコードを持っている:Strange "既にデータベースにオブジェクトがあります。"エラー

IF OBJECT_ID('tempdb..#PropList') IS NOT NULL 
    DROP TABLE #PropList 

DECLARE @Split CHAR(1), @propList NVARCHAR(MAX), @PropListXml XML 
SET @Split = ',' 
SET @propList = 'NAME,DESCRIPTION' 
-- SET @propList = '' 

IF (@propList IS NOT NULL AND @propList != '') 
    BEGIN 
    SET @PropListXml = CONVERT(XML,'<root><s>' + REPLACE(@propList, @Split, '</s><s>') + '</s></root>') 

    SELECT SystemName = T.c.VALUE('.','nvarchar(36)') 
    INTO #PropList 
    FROM @PropListXml.nodes('/root/s') T(c) 
    END 
ELSE 
    BEGIN 
    SELECT SystemName 
    INTO #PropList -- Stops here 
    FROM tblProperty 
    END 

SELECT * FROM #PropList 

かかわらず@propListの値を、このコードは、常にこのエラーで示された行で停止:

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

私の期待はのことだけでした2つのIFブロックが実行されるため、SELECT... INTOステートメントでテーブルを作成しようとする試みは1つだけにしてください。なぜこれは失敗するのですか?

+2

が明示的に' IF'前に '#のPropList'を作成してみてください...':このについての詳細はSO、次の質問を参照してください。 –

+0

@ChrisPickford:それは私のために働いた。私はちょうどこのように動作していない理由が困惑しています –

+0

このエラーは、コード解析中(および実行前)に生成され、コード解析は(期待通りに)制御フロー文を実行しません。この問題を回避するには、@Chris Pickfordの答えを使用してください。 – Alex

答えて

2

コメントを1として、あなたは、これは、SQL Serverが検証されている場合ので、あなたの

SELECT ... INTO #temp 

INSERT INTO #temp SELECT ... 

する変更、明示的IF文の前に、あなたの#tempテーブルを定義する必要がありますそれはどんな制御フロー文も無視します。その後、 `INSERT INTO SELECT #PropListを行い、

T-Sql appears to be evaluating "If" statement even when the condition is not true

関連する問題