2013-10-29 9 views
6

임시 테이블 (#temp_table)을 먼저 확인하고, 존재하는 경우 삭제하고, 테이블을 사용하고, 완료되면 마지막으로 삭제하는 저장 프로 시저가 있습니다. 이 SP는 사용자가 무언가를 트리거 할 때 무작위로 호출되며 때로는 SP가 동시에 실행되거나 일부 중복 될 수 있습니다.MS SQL Server 2005에서는 같은 SP를 여러 번 실행하여 임시 테이블에 액세스 할 때 어떤 현상이 발생합니까?

내가 말하길 Exec1과 Exec2 둘 다 #temp 테이블을 만들고, 변경하고, 삭제하는 동일한 SP를 가지고 있으며, 그들은 서로 밀리 초 내에 실행 중이다.

어떻게됩니까? Exec1은 #temp_table을 잠그고 Exec1은 Exec1이 완료되는 동안 기다릴 것입니까? 그것은 내 경우에 분명히 바람직 할 것이다. Exec1 & 2가 sametime에서 테이블을 사용하기를 원하지 않으며 Exec1이 이미 테이블을 사용하고 있기 때문에 Exec2가 실패하지 않도록합니다.

[편집] 임시 테이블을 테이블 변수로 변환해야합니까?

답변

5

당신이 하나의 # 기호 SQL 서버에있는 로컬 임시 테이블을 만드는 경우는 아래 점수와 백 엔드의 일부 ID 몇 가지를 사용합니다. 이름이 #Temp 인 Temp 테이블을 작성한다고 가정하십시오. tempdb에 sql 서버 이름이 #Temp_______10912098 인 테이블을 작성하면 별도 연결로 작성된 모든 Temp 테이블의 이름 끝에 ID가 생깁니다. TempTables


모든 임시 서로 다른 연결 모두에서 만든 테이블 이름 #Temp을 가지고 있지만 일부 밑줄로 추가됩니다 및 unique id SQL Server는 그들 사이에 구별하기 위해 사용합니다.

+1

그렇다면 내 SP에서 'IF OBJECT_ID ('tempdb .. # temp_table ')가 NULL이 아님 \t DROP TABLE # temp_table' 이것은 아무 것도하지 않습니까? 아니면 잠재적으로 다른 사형 집행에 악영향을 미칠 수 있습니까? – jreed121

+2

임시 테이블의 범위가 세션으로 제한되므로 매회 (예 : 웹 앱에서) 새 세션에서 호출하는 것은 필요하지 않습니다. 자세한 내용은 내 대답을 참조하십시오. –

+3

Dommer가 말했듯이, 당신이 그것을 만들려고 시도하기 전에 OBJECT의 Existence를 확인하는 것이 항상 좋은 방법입니다. 귀하의 proc에서 약간의 코드를 유지하십시오. –

4

임시 테이블 #table의 범위는 세션으로 제한되므로 문제가되지 않습니다.

##table을 사용했다면 이는 글로벌이며 문제가있을 수 있습니다.

는 여기를 참조하십시오 : MSDN SQL Tables

특히이 비트 : 데이터베이스 세션은 #employees는, 에만 세션 테이블에서 작동 할 수있는 로컬 임시 테이블을 생성하고 삭제됩니다

경우 때 세션 연결이 끊어졌습니다. 전역 임시 테이블 ##employees을 만들면 데이터베이스의 모든 사용자가이 테이블에서 작업 할 수 있습니다. 이 테이블을 만든 후에 다른 사용자가이 테이블에 대해 작업하지 않으면 연결을 끊을 때 테이블이 삭제됩니다. 다른 사용자가 테이블을 만든 후에 테이블과 함께 작동하는 경우 SQL Server는 연결을 끊으면 테이블을 삭제하고 다른 모든 세션에서는 테이블을 더 이상 적극적으로 사용하지 않으면 테이블을 삭제합니다. SQL Server의

3

해시가 # 인 임시 테이블은 개별 연결에 고유합니다.

이렇게 두 연결 ("프로세스"또는 "SPID"라고도 함)이 모두 #tablename에 의해 임시 테이블을 참조하는 경우 실제로 다른 테이블을 참조하게됩니다.

tempdb를 보면이 내용을 볼 수 있습니다. #748B826C과 같은 여러 테이블이 있습니다.실제로는 declare @t table (ix int identity primary key)과 같은 임시 테이블 변수와 해시가있는 임시 테이블 이름입니다.

이렇게 재귀 적 트리거가 아닌 다른 연결 인 경우, 아무런 문제가 없어야합니다.

그러나 재귀 적 트리거의 가능성이 염려되는 경우 테이블 변수를 사용해야합니다. 이것들은 배치 또는 저장 프로 시저의 범위로 제한됩니다.