2013-12-16 52 views
2

我正在上具有下列代碼的存儲過程的交替運行以下消息無效的對象名稱#TEMP

 Invalid object name #alert 

IF OBJECT_ID('tempdb..#alert') IS NOT NULL 
     DROP TABLE #alert 
    ELSE 
    create table #alert(order varchar(50)) 

    BULK INSERT #alert 
    FROM 'C:\OrderImport\NewOne.txt' 
    WITH 
    (
     FIELDTERMINATOR ='\t', 
     ROWTERMINATOR ='\n', 
     FIRSTROW = 2 
    ) 
+0

的'IF'和'ELSE'聲明必須由'BEGIN'和'END包圍'正常運作。所以'如果'[某事]'開始'[做某事]'結束'。 – Question3CPO

+1

@ Question3CPO只有當你在他們的塊中執行多於1條語句時,總是使用'BEGIN..END'塊是一個好習慣。 :) –

回答

1

你的邏輯導致#alert被丟棄每其他時候你運行SP。第一次運行時,它將輸入ELSE塊並創建#alert表,因此該過程的其餘部分會成功。下一次運行時,它會進入IF區塊並丟棄先前創建的表格,因此BULK INSERT #alert會失敗。

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

create table #alert(order varchar(50))  

BULK INSERT #alert 
FROM 'C:\OrderImport\NewOne.txt' 
WITH 
(
    FIELDTERMINATOR ='\t', 
    ROWTERMINATOR ='\n', 
    FIRSTROW = 2 
) 

只需刪除ELSE,它會檢查實存的表,如果它確實存在,它會刪除它,然後創建一個新的,你不需要在這裏ELSE語句。因爲如果它不存在,那麼控制器將跳轉到ELSE塊,但是如果它確實存在,控制將進入IF塊刪除表並跳過ELSE塊,因爲在IF .. ELSE塊中只執行一個代碼塊。

IF OBJECT_ID('tempdb..#alert') IS NOT NULL --<-- if not null  
BEGIN 
    DROP TABLE #alert      --<-- Drops the table 
END 
ELSE 
    CREATE TABLE        --<-- This statement Never gets executed 
              -- since the control fell in the 1st block 
              -- it never goes into ELSE Block 

如果你想使用IF.. ELSE塊,你可以做這樣的事情......

IF OBJECT_ID('tempdb..#alert') IS NOT NULL   
BEGIN 
    DROP TABLE #alert 
    create table #alert(order varchar(50)) 
END 
ELSE 
    BEGIN 
    create table #alert(order varchar(50)) 
    END