SQL-Server에서 테이블 변수를 삭제하려면 어떻게합니까? 나도해야하나요?


123

스크립트에 저장 프로 시저가 아닌 테이블 변수가 있습니다. 두 가지 질문 :

  1. 테이블 변수를 어떻게 삭제합니까? Drop Table @varName은 "잘못된 구문"오류를 제공합니다.
  2. 나는 항상 이것을해야합니까? 좋은 습관이라고 들었습니다. 이와 같은 작은 스크립트에 정말로 필요합니까?

내 코드는 다음과 같습니다.

Declare @projectList table(
    name varchar(40) NOT NULL);

Insert Into @projectList
Values ('BCR-00021')

Select *
From @projectList

Drop Table @projectList -- does not work

질문의 두 번째 부분은 적용되지 않으므로 직접 삭제할 수 없습니다.
Martin Smith

답변:


189

테이블 변수는 자동으로 로컬이며 자동으로 삭제됩니다. 걱정할 필요가 없습니다.


17
+1- 원하는 경우에도 삭제할 수 없습니다 . 다른 변수와 마찬가지로 세션이 열려있는 한 지속됩니다. 또한 거래의 영향을받지 않습니다.
JNK 2011

10
@JNK는 트랜잭션의 영향을받지 않는다는 점이 중요하므로 테이블 변수를 사용하여 데이터를 보관하고 오류로 인해 롤백 된 후 로그 테이블에 쓸 수 있습니다.
HLGEM 2011

3
아니요, 동일하지 않습니다. 임시 테이블은 트랜잭션에 참여합니다.
Paul Perigny 2011

CTE와 동일하지도 않습니다.
Hogan

당신이 그들을 삭제할 수 없습니다하지만 당신은 그들을 '삭제 @projectList'을 삭제할 수 있습니다)
RK 샤르마에게

29

테이블 변수는 int 또는 varchar 변수와 같습니다.

그것들을 떨어 뜨릴 필요가 없습니다. int 또는 varchar 변수 와 동일한 범위 규칙 이 있습니다.

변수의 범위는 변수를 참조 할 수있는 Transact-SQL 문의 범위입니다. 변수의 범위는 선언 된 시점부터 선언 된 배치 또는 저장 프로 시저가 끝날 때까지 지속됩니다.


1
테이블 변수로 만든 tempdb 개체가 범위를 벗어날 때 정리되는지 여부를 알고 있습니까? 아니면 세션을 정리하기 전에 세션이 닫힐 때까지 서버가 대기합니까?
StriplingWarrior

21

다른 누군가가 이것을 발견하면 ... 루프 에서처럼 정말로 드롭해야 할 경우 테이블 변수에서 모두 삭제할 수 있습니다.

DELETE FROM @tableVariableName

7

그러나 변수 테이블이 루프 내에서 사용되는 경우 루프 내에서 데이터를 다시로드하기 전에 비우기 (@table 삭제)가 필요하다는 것을 모두 언급하는 것을 잊었습니다.


3

TempTables와 마찬가지로 로컬 테이블 변수도 TempDB에 생성됩니다. 테이블 변수의 범위는 선언 된 배치, 저장 프로 시저 및 문 블록입니다. 프로 시저간에 매개 변수로 전달할 수 있습니다. 생성 한 세션을 닫으면 자동으로 삭제됩니다.


#temp 테이블은 @table 변수와 동일하지 않습니다. 패치 또는 범위 종료 후 자동으로 삭제되지 않습니다. 저장 프로 시저 내에서 생성되고 저장 프로 시저 실행이 완료된 경우에만 자동으로 삭제됩니다.
Abou-Emish

1

여기에 해결책이 있습니다

Declare @tablename varchar(20)
DECLARE @SQL NVARCHAR(MAX)

SET @tablename = '_RJ_TEMPOV4'
SET @SQL = 'DROP TABLE dbo.' + QUOTENAME(@tablename) + '';

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(@tablename) AND type in (N'U'))
    EXEC sp_executesql @SQL;

SQL Server 2014 Christophe에서 잘 작동합니다.

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