2013-12-16 2 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'로 묶어야합니다 '제대로 작동합니다. 그래서'IF' [뭔가]'BEGIN' [Do something]'END'. – Question3CPO

+1

@ Question3CPO 당신이 그 블록에서 1 개 이상의 명령문을 실행하는 경우에만 그렇지만 항상'BEGIN..END' 블록을 사용하는 것이 좋습니다. :) –

답변

1

당신의 논리가 #alert의 원인이 삭제 될하기 위해 모든 다른 시간에 SP를 실행하십시오. 처음 실행할 때 ELSE 블록을 입력하고 #alert 테이블을 작성하므로 나머지 프로 시저가 성공합니다. 다음에 실행할 때 IF 블록을 입력하고 이전에 만든 테이블을 삭제하므로 BULK INSERT #alert이 실패합니다. 당신이 필요로하고 여기 ELSE 문 해달라고,

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를 제거하고 그것을 떨어질 것이다 존재하고 새로 만들기 않는 경우는, 테이블의 존재하지 않는지 확인합니다. 왜냐하면 만약 존재하지 않으면 contorl은 ELSE 블록으로 점프 할 것이지만 만약 존재한다면 컨트롤은 IF 블록에 들어갑니다. 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