itsource

SQL-Server에서 테이블 변수를 드롭하려면 어떻게 해야 합니까?이래도 되나?

mycopycode 2023. 4. 7. 21:17
반응형

SQL-Server에서 테이블 변수를 드롭하려면 어떻게 해야 합니까?이래도 되나?

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

  1. 테이블 변수를 드롭하려면 어떻게 해야 하나요?드롭 테이블 @varName에서 "Incorrect snytax" 오류가 나타난다.
  2. 항상 이렇게 해야 하나요?좋은 연습이라고 들었어요.이런 작은 스크립트에 꼭 필요한가요?

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

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

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

Select *
From @projectList

Drop Table @projectList -- does not work

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

누군가 이걸 발견한다면...루프 상태에서는 테이블 변수에서 모두 삭제할 수 있습니다.

DELETE FROM @tableVariableName

테이블 변수는 int 또는 varchar 변수와 동일합니다.

떨어뜨릴 필요 없어요int 또는 varchar 변수와 동일한 범위 규칙을 가집니다.

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

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

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

Temp 테이블 변수는 temp.db에 저장되며 스코프는 현재 실행으로 제한됩니다.따라서 Temp 테이블을 드롭하는 것과 달리 temp 테이블 변수 @tempTableVariable을 명시적으로 드롭할 필요는 없습니다.sql 서버에 의해 자동으로 관리됩니다.

drop table @tempTableVariable -- Invalid

정말이지, 당신은 그것을 떨어뜨릴 필요가 없다.@local_variable.

단,#local_table예를 들어 여러 번 쿼리를 다시 작성할 수 있어 편리합니다.

SELECT *
INTO #recent_records
FROM dbo.my_table t
WHERE t.CreatedOn > '2021-01-01'
;

SELECT *
FROM #recent_records
;

/*
  can DROP here, otherwise will fail with the following error
  on re-execution in the same window (I use SSMS DB client):

  Msg 2714, Level ..., State ..., Line ...
  There is already an object named '#recent_records' in the database.
*/
DROP TABLE #recent_records
;

SELECT 문을 TRANSACTION에 삽입하여 명시적인 드롭 없이 재실행할 수도 있습니다.

BEGIN TRANSACTION

  SELECT *
  INTO #recent_records
  FROM dbo.my_table t
  WHERE t.CreatedOn > '2021-01-01'
  ;

  SELECT *
  FROM #recent_records
  ;

ROLLBACK

여기 해결책이 있습니다.

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에서 정상적으로 동작

언급URL : https://stackoverflow.com/questions/5653520/how-do-i-drop-table-variables-in-sql-server-should-i-even-do-this

반응형