업데이트에 대한 답변은 저장 프로 시저 내부의 지역 변수 인 것처럼 임시 테이블이 될 것입니다 전혀 때문에 걱정하지 마십시오이다.내가
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를 당 고유하기 때문에 데이터가 손실되지 않습니다 그것은 자기
희망에 의해 자동으로 삭제되기 때문에 (이 당신에게
로컬 임시 테이블 도움이 될 것입니다 당신이 완료 할 때 테이블을 삭제해야 할의 ingle # prefix)는 현재 연결에 대해 범위가 지정되며 동시 세션과 충돌하지 않습니다. –
테이블 변수는 기본 키와 고유 제한 조건을 지원하고 SQL 2014 이상 버전에서는 인덱스를 지원합니다. –