SQL Server 테이블 : @, # 및 ##의 차이점은 무엇입니까?


답변:


114

#table 로컬 (생성 한 사용자 만 볼 수 있음) 임시 테이블을 나타냅니다.

##table 전역 (모든 사용자에게 표시됨) 임시 테이블을 나타냅니다.

@variableName 유형에 따라 값을 보유 할 수있는 변수를 나타냅니다.


31
#table에 대한 정의가 완전히 올바르지 않습니다. 사용자에 국한되지 않고 연결에 국한됩니다. 사용자에게 여러 연결이있는 경우 처음에 #table을 만든 연결에만 표시됩니다.
Davin Studer

@DavinStuder는 중요한 설명을 제공했습니다. 사용자가 볼 수있는 테이블과 현재 연결에서만 볼 수있는 테이블의 차이는 매우 중요합니다.
mirzmaster

@DavinStuder 사용자에 대한 다중 연결을 보는 방법은 무엇입니까? 동일한 연결 문자열?
Kiquenet 19


7

#그리고 ##테이블은 임시 데이터베이스에 표현 실제 테이블입니다. 이러한 테이블에는 인덱스와 통계가있을 수 있으며 세션의 sproc에서 액세스 할 수 있습니다 (전역 임시 테이블의 경우 세션 전체에서 사용 가능).

@table은 테이블 변수입니다.

추가 정보 : http://www.sqlteam.com/article/temporary-tables


4
또한 테이블 변수는 크기가 너무 커서 메모리에 저장할 수없는 경우 tempDB 데이터베이스에도 있습니다.
marc_s

5

#table과 @table의 차이점에 집중하겠습니다. ## table은 전역 임시 테이블이며 SQL Server를 10 년 넘게 사용한 기록으로는 아직 유효한 사용 사례를 발견하지 못했습니다. 일부가 존재한다고 확신하지만 개체의 특성으로 인해 IMHO를 매우 사용할 수 없습니다.

@marc_s의 @whiner에 대한 응답은 절대적으로 사실입니다. 테이블 변수가 항상 메모리에 상주한다는 것은 널리 알려진 신화입니다. 실제로 테이블 변수가 디스크로 이동하여 임시 테이블처럼 작동하는 것은 매우 일반적입니다.

어쨌든 @Astander가 지적한 링크를 따라 차이점을 읽는 것이 좋습니다. 대부분의 차이점은 @table 변수로 할 수없는 작업에 대한 제한을 포함합니다.


계산의 다른 부분을 수행하고 단일 결과를 출력하는 5 개의 별도 저장 프로 시저가 있습니다. 감사를 위해 중간 값을보고 싶습니다. 감사 자도 마찬가지입니다. 일부를 ## Temp 테이블에 덤프하도록 절차를 조정하여 둘 다 볼 수 있지만 유지되지는 않습니다 (감사 중에 만 필요함). 유효한 사용 사례가 있습니다 (IMHO!).
RyanfaeScotland 2015 년

@Ryan dbo.Table을 사용할 수 있는데 ## Table이 유효한 이유는 무엇입니까? 나는 당신이 한 모든 것이 DROP 문을 입력하지 않아도 될 때 유효한 사용 사례라고 생각하지 않습니다.
Aaron Bertrand

4
감사 자에게 DB에 대한 DROP 권한을 부여하고 싶지 않습니다. 나는 또한 그가 끝난 후에 돌아와서 정리할 필요가 없습니다. 임시 테이블을 사용하면 원하는만큼 자주 쿼리를 실행할 수 있으며 작업이 완료되면 DB에 풋 프린트를 남기지 않습니다.
RyanfaeScotland

4
CREATE TABLE #t

해당 CONNECTION에서만 볼 수있는 테이블을 만들고 다른 연결을 만든 동일한 사용자는 다른 연결에서 #t 테이블을 볼 수 없습니다.

CREATE TABLE ##t

다른 연결에 표시되는 임시 테이블을 만듭니다. 그러나 연결 생성이 종료되면 테이블이 삭제됩니다.


SqlConnection.Open()동일한 연결 문자열 은 IS 같은 연결은 ?
Kiquenet 19

2
아니요, 동일한 데이터베이스에 대한 연결이지만 거의 확실하게 동일한 연결은 아닙니다.
Markus

0

고유 한 전역 임시 테이블이 필요한 경우 Uniqueidentifier 접두사 / 접미사를 사용하여 고유 한 테이블을 만들고 if object_id (.... 인 경우 사후 실행을 삭제합니다. 유일한 단점은 동적 SQL을 사용하고 명시 적으로 삭제해야하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.