2012-07-19 2 views
1

다음은 필자의 시나리오입니다. 나는이 GO를 inclide하지 않는 한 나는 이름이 같은 임시 테이블을 사용할 수 없습니다 게시물 중 하나를 알아 낸동일한 이름의 임시 테이블 사용 중 오류가 발생했습니다. SQL Server

DECLARE @date DATE 

If object_id('tempdb..#TempList') is not null drop table #TempList 
go 

Create table #TempList (MILL_NO VARCHAR(7), SHIP_DATE DATE, BL_STATUS NCHAR(1), 
FOOTAGE DECIMAL(12,4)) 

If @date IS NULL 

Insert into #TempList 
Select mill_no, null, bl_status,footage from fn_A(0,0) 

Select * from #TempList 


If object_id('tempdb..#TempList') is not null drop table #TempList 
go 

Create Table #TempList (MILL_NO VARCHAR(7), SHIP_DATE DATE, BL_STATUS NCHAR(1), 
FOOTAGE DECIMAL(12,4)) 

If @date IS NOT NULL 

Insert into #TempList 
Select * from fn_B(0,'06/06/2006') 

Select * from #TempList 

(내 저장된 프로 시저가 입력 매개 변수로 @date 복용 후). 그러나 GO를 포함하여 전달하려고하는 매개 변수를 사용하지 않습니다.

이 오류를 제거하기위한 대체 방법이 있습니까?

+3

왜 임시 테이블을 삭제하고 다시 만드시겠습니까? 그냥 자르지 않는 이유는 무엇입니까? – LittleBobbyTables

답변

2

제공된 절차에 따라 대신 TRUNCATE TABLE을 사용할 수 있습니다.

당신이하고 싶은 것은 신속하게 레코드를 제거하는 경우 테이블을 삭제하고 다시 만들 때 포인트가 보이지 않습니다.

편집

당신은 삭제하고 같은 이름의 테이블을 재 작성하지 않는다; 대신이 코드의 :

If object_id('tempdb..#TempList') is not null drop table #TempList go 
Create Table #TempList (
    MILL_NO VARCHAR(7), 
    SHIP_DATE DATE, 
    BL_STATUS NCHAR(1), 
    FOOTAGE DECIMAL(12,4) 
) 

그냥 이렇게 :

TRUNCATE TABLE #TempList 
+0

같은 이름의 임시 테이블을 삭제하지 않으면 어떻게 할 수 있습니까? – rock

+0

truncate가 #table의 데이터를 삭제한다는 사실에 감사하지만 여기에서 내 문제를 해결하기위한 개념을 이해하지 못합니다. 여기에 내 상황은 ** 두 개의 다른 함수 (fn_A, fn_B)에서 임시 테이블 (이름이 같은)에 데이터를 삽입하는 것입니다. ** @date가 null인지 아닌지를 확인해야하기 때문에이를 수행 할 수 없습니다 삽입. – rock

+0

왜 임시 테이블에 * 같은 이름을 사용해야합니까? – LittleBobbyTables

0

if object_id('tempdb..#TempList')가에 allways NULL입니다 #TempList 당신이 create table #TempList

편집을 tempdb에의을 sysobjects 테이블에 생성 된 결과 이름이 아니기 때문에
어떨까요 :

CREATE PROC PIRULO(@date as DATE) as 

Create table #TempList (MILL_NO VARCHAR(7), SHIP_DATE DATE, BL_STATUS NCHAR(1), FOOTAGE DECIMAL(12,4)) 
IF @date IS NULL 
    Insert into #TempList 
    Select mill_no, null, bl_status,footage from fn_A(0,0) 
ELSE 
    Insert into #TempList 
    Select * from fn_B(0,'2006/06/06') -- also I changed date order. 

Select * from #TempList 
+0

그러면 SQL에서 '데이터베이스에'#TempList '라는 개체가 이미 있습니다.' – rock

+1

이 답변의 두 번째 부분은 정확하지만 첫 번째 부분은 올바르지 않습니다. 'OBJECT_ID'는 OP가 그것을 사용함에 따라 작동합니다. –

+0

SQL은 ''tempdb .. # TempList' 때문에 'object_id ('tempdb .. # TempList ')가 널이기 때문에'drop table # TempList'가 실행되지 않았기 때문에 '#TempList' 그 테이블을 참조하는 방법이 아니야 –

0

주어진 조건이 충족 될 때 요즘 같은 임시 테이블에 값을 삽입하는 데 어려움을 겪었습니다.

FoxPro (커서가 모두 선언 된)를 SQL Server로 마이그레이션하는 중이므로이 작은 논리를 여러 저장된 procs에 구현해야했습니다.

마지막으로 내가 배웠던 것은 - 다른 것을 시도하기 전에 생각 해보세요 (DB 마이그레이션에서 공동 초안자에게 제안).

DECLARE @date DATE 

SET @date = '06/06/2006' [email protected] = null 

If object_id('tempdb..#TempList') is not null drop table #TempList 

Create table #TempList (MILL_NO VARCHAR(7), SHIP_DATE DATE, BL_STATUS NCHAR(1), 
FOOTAGE DECIMAL(12,4)) 

If @date = null 

-- Here I am inserting null in place of Ship_Date because fn_A returns only 3 columns in my case 
Insert into #TempList 
Select mill_no, null, bl_status,footage from fn_A(0,0) 

--Select * from #TempList 

else 

Insert into #TempList 
Select * from fn_B(0,@date) 

Select * from #TempList 

의견을 보내 주셔서 감사합니다. 희망이 사람을 도움이됩니다.

+0

은 정확히 내가 제안했던 코드가 아니다 ?? 사실 유일한 차이점은 #TempList 테이블의 존재 여부를 확인하는 것입니다. 하지만 temp 테이블에 저장 프로 시저 범위가 중복되어 있는지 확인하십시오. –

+0

내 자신의 생각에 대해 생각했습니다. (구문 적으로 제안한 것과 같음) ..하지만 데이터를 잘라내고 내 요구 사항을 재사용하는 것이 좋습니다. 동일한 이름의 테이블 .. – rock

+0

다른 anwser입니다, 나는 TRUNCATE 언급하지 않았습니다. 당신은 "좋은 대답"으로 많은 anwsers을 표시 할 수있는 좋은 anwser로 표시 할 수 있습니다 –

관련 문제