2011-03-07 5 views
1

SQL Server에서 #temp와 같은 이름의 임시 테이블에는 로컬 범위가 있습니다. 세션에서 생성 한 경우 세션의 모든 항목에서 세션을 볼 수 있지만 세션 외부는 볼 수 없습니다. 저장 프로 시저 내에 이러한 테이블을 만들면 범위는 해당 프로 시저에 대해 로컬입니다. 그래서 proc을 종료하면 테이블이 사라집니다.SQL Server의 세션 전역 임시 테이블

제가 알고있는 유일한 대안은 ## temp와 같은 이름의 테이블을 사용하는 것입니다. 이는 일시적이지만 서버 전체에서 볼 수 있습니다. 세션에서 테이블을 만들면 옆집 사무실의 Bob도 볼 수 있습니다.

내가 찾고있는 것은 어딘가에 중간에 있으므로 저장 프로 시저 내에서 테이블을 만들고이 테이블을 저장된 proc이 종료 된 후에도 내 세션에서 사용할 수있게 할 수 있습니다. 가장 가까운 내가 찾을 수있다, 그것에 하나의 필드가있는 테이블을 생성하고 저장된 proc 내에서 그것을 변경하는 것입니다. 그래도 약간의 진흙탕처럼 보입니다.

답변

1

세션을 시작할 때 테이블을 만든 다음 저장된 proc을 실행 한 다음 저장된 proc을 실행 한 후에 테이블에서 원하는 작업을 수행 할 수 있습니까?

+0

내가 말한 kludge입니다. 나는 그것을 잘 할 필요가있다. –

0

나는 당신이 필요로하는 것을 SQL 서버의 상자 솔루션이라고 생각하지 않는다. 나는 유일한 방법은 그것을 직접 관리하는 것입니다. 전역 테이블을 사용하는 대신 접미어가있는 일반 테이블을 만들면됩니까 (어디에서 전체 이름을 관리 할 것인가)? 전역 테이블이 tempdb로 이동하므로 부작용으로 데이터베이스에 데이터를 격리하는데도 도움이됩니다.

2

데이터가 지속되거나 공유되지 않는 경우 클라이언트 코드에 결과를 캐시합니다. 그것이 지속되거나 공유 될 것이라면, 당신은 정상적인 테이블을 사용할 것입니다.

즉, 결과 및 호출 관점에서 저장 프로 시저 호출은 상태가 없어야합니다. 데이터가 세션에 비공개 인 경우 클라이언트에 있어야합니다. 이 서버 resourcey를 사용 방지하고 당신이, 당신은 연결 만CONTEXT_INFO를 사용하는 것을 에 대한 열려있는 연결에 적은 양의 데이터 (128 바이트)를 지속 할 수를 말하는 전화

사이 열려있는 연결을 보관할 필요가없는 것을 의미합니다.

+0

감정을 공유 하겠지만 새로운 코드는 아닙니다. 난 덜 복잡한 보고서를 만들려고 노력 중이 야 ... 혼란스러운 프레임 워크. 불행히도 임시 테이블은 현재 존재해야하며 생성 할 수있는 위치는 제한되어 있습니다. 제가 언급 한 kludge를 사용해야 할 수도 있습니다. –

+0

아무것도 좋지 않다 ... 죄송합니다 ... – gbn

4

당신을 위해 효과가 있을지도 모르는 또 다른 단서는 여기에 관련된 임시 테이블의 수에 따라 다릅니다.

임시 테이블을 실제 테이블로 만들고 SPID라는 추가 열을 @@SPID으로 기본 설정합니다.

그런 다음이 테이블을 액세스하는보기를 만들고 @@SPID 값을 기준으로 필터를 만듭니다. 이보기를 통해 이루어지는 모든 작업은 세션별로 분리 된 것처럼 보입니다. 예는 :

create table temp_Boris (
    SPID int default @@SPID, 
    ColA int, 
    ColB varchar(10) 
) 
go 
create view vBoris 
as 
    select ColA,ColB from temp_Boris where SPID = @@SPID 
go 

그런 다음, 하나 개의 연결에서 다음을 실행합니다

insert into vBoris(ColA,ColB) 
select 10,'abc' union all 
select 20,'def' 
go 
select * from vBoris 

그리고 다른 연결에서 다음을 실행합니다

insert into vBoris(ColA,ColB) 
select 10,'abc' union all 
select 20,'def' 
go 
select * from vBoris 
select * from temp_Boris 
go 
delete from vBoris 
go 
select * from vBoris 
select * from temp_Boris 

그리고 당신은 각 연결 것을 볼 수 있습니다 "vBoris"를 임시 테이블처럼 취급 할 수 있습니다. 물론 오래된/부실한 결과 테이블을 지우려면 여기에 루틴을 추가해야 할 수도 있습니다.

좋아요, 알 수 있겠지만, 너무 추한 것 같습니다.

+0

다른 컨텍스트에서 이것을 사용했지만 필요한 변경을 최소화하려고합니다. 그래서 아이디어 +1,하지만 네빌 케이의 대답으로갑니다. –

관련 문제