2016-09-21 2 views
3

실행중인 sproc에만 적용되는 많은 인덱스가있는 테이블을 만들어야합니다.SQL 임시 테이블은 Proc에만 적용됩니다

테이블 변수를 시도했지만 인덱스를 지원하지 않는 것 같습니다. 로컬 임시 테이블은 '실제'테이블을 만드는 것으로 보이며 proc의 끝 부분에 명시 적으로 삭제해야합니다. 여기에서 proc은 동시 실행에서 공유되므로 추측 할 수 있습니다.

실행중인 sproc의 유일한 인스턴스에서만 범위가 지정된 인덱스를 사용하여 데이터를 저장하려면 무엇을 사용할 수 있습니까?

+1

로컬 임시 테이블 도움이 될 것입니다 당신이 완료 할 때 테이블을 삭제해야 할의 ingle # prefix)는 현재 연결에 대해 범위가 지정되며 동시 세션과 충돌하지 않습니다. –

+0

테이블 변수는 기본 키와 고유 제한 조건을 지원하고 SQL 2014 이상 버전에서는 인덱스를 지원합니다. –

답변

3

테이블을 떨어 뜨릴 염려가 없습니다. SQL Server는 자동으로 처리합니다. documentation에서 설명하고있는 바와 같이 : 저장 프로 시저가 완료되면

  • 저장 프로 시저에서 만든 로컬 임시 테이블

    가 자동으로 삭제됩니다. 테이블은 테이블을 만든 프로 시저에 의해 실행되는 중첩 저장 프로 시저에서 참조하는 일 수 있습니다. 은 테이블을 만든 저장 프로 시저를 호출 한 프로세스를 참조 할 수 없습니다.

이것은 임시 테이블에 대한 액세스 범위 지정의 결과입니다.

사실 나는 임시 테이블을 저장 프로 시저에 명시 적으로 삭제하는 경향이 있음을 인정합니다. 사이의 차이 :

  • create table temp
  • create table #temp
  • create table ##temp

두 번째는 자동으로 삭제된다는 사실에 의존 너무나 비슷하지만, 첫 번째와 세 번째는 없습니다. 그러나 이것이 나의 "문제"이며 모범 사례는 아닙니다.

+0

내가 작성한 #temp 테이블에 삽입 및 업데이트가 있고 프로세스가 아직 완료되지 않은 상태에서 저장 프로 시저에 대해 다른 호출이 발생했다면 걱정할 필요가 있다고 생각합니다. 붐 모든 데이터를 박살, # temp + UserKey 조합을 사용하는 것이 가장 좋은 방법이라고 생각하지만 동적 쿼리를 실행해야합니다 – Monah

+1

@HadiHassan. . . 설명서를 읽으십시오. SQL Server는 그러한 우발적 인 상황을 방지합니다. 사실, 일반 테이블의 경우 128 문자가 아니라 임시 테이블 이름 (116 문자)이 어색합니다. –

+0

: P 나는 0.5M의 평판 Guy !!와 논쟁해서는 안된다. 나는 내 대답을 테스트로 업데이트했고 당신이 옳았다. 스토어드 프로 시저의 temp 테이블은 로컬 변수처럼 동작한다. – Monah

1

업데이트에 대한 답변은 저장 프로 시저 내부의 지역 변수 인 것처럼 임시 테이블이 될 것입니다 전혀 때문에 걱정하지 마십시오이다.내가

exec TestTempData 

waitfor delay '00:00:02' 

exec TestTempData 

결과가

로 온이 쿼리를 실행 내가 가진 의심의 여지가 올바른지 아니었다면

나는 확인하고 싶었다, 그래서 나는 다음이 테스트

create procedure TestTempData 
as 
begin 
    declare @date datetime = getdate() 
    if object_id('#testing') is not null 
     drop table #testing 
    create table #testing(
     Id int identity(1,1), 
     [Date] datetime 
    ) 

    print 'run at ' + format(@date,'HH:mm:ss') 

    insert into #testing([Date]) values 
    (dateadd(second,10,getdate())), 
    (dateadd(second,20,getdate())), 
    (dateadd(second,30,getdate())) 
    waitfor delay '00:00:15' 
    select * from #testing 
end 

했다

run at 14:57:39 
Id Date 
1 2016-09-21 14:57:49.117 
2 2016-09-21 14:57:59.117 
3 2016-09-21 14:58:09.117 

두 번째 결과

run at 14:57:56 
Id Date 
1 2016-09-21 14:58:06.113 
2 2016-09-21 14:58:16.113 
3 2016-09-21 14:58:26.113 

동시 실행이 #temp 테이블을 초래한다면은 모두 그 안에 저장 프로 시저 임시 테이블이 있어서 내부 로컬 변수와 같은 역할을 보인다 케이스되지 않은 동일해야 결과 .

당신은 임시 테이블을 동시 실행을 통해 공유되는 것을 언급 한 이후 고든 리노 프

채팅을하기 전에 임시 테이블은 현재 실행에 대해 고유해야합니다.

저장 프로 시저는 위의 솔루션은 충돌이 발생하지 않습니다 것을 보장합니다이

create procedure YourProc(@userId int) 
as 
begin 
    if object_id('#temp' + @userId) IS NOT NULL 
     execute('DROP TABLE #temp' + @userId +'') 
    ... 
    execute('insert into #temp' + @userId + 'values(...') 
end 

과 같아야하고 각 실행은 그렇게하지

userId를 당 고유하기 때문에 데이터가 손실되지 않습니다 그것은 자기

희망에 의해 자동으로 삭제되기 때문에 (이 당신에게