문제

왜 이 작업을 수행할 수 없으며 해결 방법이 있습니까?

이 오류가 발생합니다.

MSG 2714, Level 16, State 1, 13 행은 이미 데이터베이스에 '#Temptable'이라는 객체가 있습니다.

declare @x int

set @x = 1

if (@x = 0)
begin
    select 1 as Value into #temptable
end
else
begin
   select 2 as Value into #temptable
end

select * from #temptable

drop table #temptable
도움이 되었습니까?

해결책

이것은 두 부분으로 구성된 질문이며 Kev Fairchild는 두 번째 질문에 대해 좋은 답변을 제공하지만 첫 번째 질문은 완전히 무시합니다. 왜 오류가 발생합니까?

대답은 전처리기가 작동하는 방식에 있습니다.이것

SELECT field-list INTO #symbol ...

다음과 직접적으로 동일한 구문 분석 트리로 해석됩니다.

DECLARE #symbol_sessionid TABLE(field-list)
INSERT INTO #symbol_sessionid SELECT field-list ...

그러면 #symbol이 로컬 범위의 이름 테이블에 저장됩니다._sessionid의 목적은 각 사용자 세션에 개인 네임스페이스를 제공하는 것입니다.두 개의 해시(##symbol)를 지정하면 이 동작이 억제됩니다.sessionid 확장의 해제 및 해제는 (분명히) 투명합니다.

이 모든 것의 결과는 여러 INTO #symbol 절이 동일한 범위에서 여러 선언을 생성하여 Msg 2714로 이어진다는 것입니다.

다른 팁

지연된 이름 확인 때문에 그렇게 할 수 없습니다. 실제 테이블에서는 할 수 있습니다. 파운드 기호만 빼면 됩니다.

먼저 임시 테이블을 만든 다음 테이블에 정기적으로 삽입할 수도 있습니다.

첫 번째 단계...테이블이 이미 존재하는지 확인하십시오 ...그렇다면 삭제하십시오.다음으로, SELECT INTO...를 사용하는 대신 명시적으로 테이블을 생성합니다.

그렇게 하면 훨씬 더 안정적이라는 것을 알게 될 것입니다.

IF OBJECT_ID('tempdb..#temptable', 'U') IS NOT NULL 
BEGIN
DROP TABLE #temptable
END

CREATE TABLE #temptable (Value INT)

declare @x int

set @x = 1

if (@x = 0)
begin
    INSERT INTO #temptable (Value) select 1
end
else
begin
    INSERT INTO #temptable (Value) select 2
end

select * from #temptable

drop table #temptable

또한 예를 들어 테이블 및 필드 이름이 단순화되어 있기를 바랍니다. 정말 그들에게 전화해라 ;)

-- 케빈 페어차일드

지연된 이름 확인은 sp_dependents가 올바른 결과를 반환하는지 확신할 수 없는 이유이기도 합니다. 제가 얼마 전에 쓴 이 게시물을 확인하세요. sp_dependents에 의존합니까(말장난 의도 없음)

문제는 #temptable을 만들지 않았다는 것입니다.

죄송합니다. 더 자세히 설명할 수는 없지만 현재 보고 있는 내용을 설명하려고 시도조차 하지 않았기 때문에 별 답변을 얻지 못했습니다.

코드 모양으로 보면 SQL Studio나 그와 유사한 도구에서 프로토타입을 제작한 것처럼 보입니다. 그렇죠?이 작업을 몇 번 실행하여 #temptable이 생성되는 지점에 도달했지만 끝나기 전에 실패하여 테이블을 다시 삭제했다고 추측할 수 있습니까?사용 중인 SQL 편집 도구를 다시 시작한 후 다시 시도하세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top