programing

SQL Server 2008의 테이블 변수 잘라내기/지우기

lovejava 2023. 5. 24. 21:22

SQL Server 2008의 테이블 변수 잘라내기/지우기

SQL Server 2008에서 테이블 변수를 잘라내거나 플러시할 수 있습니까?

declare @tableVariable table
(
   id int, 
   value varchar(20)
)    

while @start <= @stop    
begin    
    insert into @tableVariable(id, value) 
        select id
            , value 
        from xTable 
        where id = @start
    
    --Use @tableVariable 

    --@tableVariable should be flushed out of 
    -- old values before inserting new  values

    set @start = @start + 1 
end 

모두 삭제하기만 하면 됩니다.

DELETE FROM @tableVariable

아니, 너는 할 수 없어.TRUNCATE실제 테이블이 아니므로 테이블 변수입니다.삭제하는 것이 더 빠릅니다.Aaron Bertrand의 이 답변을 참조하십시오.

기술적으로 올바른 사용법을 추가합니다.DELETE @VariableTable만약 당신이 당신의 신분 필드도 가지고 있다면.@Table 변수예):i int (1,1)그리고 이 테이블을 다시 사용하려고 합니다(루프로 다시 표시하더라도). 이 테이블은 여전히 범위 내에 있으며 재설정할 방법도 없습니다.

참조: 표 변수 ID

사용하는 것이 가장 좋습니다.#TempTable이 경우 - 잘라내거나 DBCC를 사용하여 다시 시드할 수 있습니다.
잘라내기를 통해 성능이 향상되고 추가 인덱스를 만들 수 있습니다.
제생에경만은약당것모면삭이것라제을할을 사용하여 것을 삭제할 DELETE @VariableTable그런 다음 당신은 코드 변환기를 도입했습니다. 당신은 사용했어야 했습니다.#TempTable그리고.TRUNCATE대신.

는 테블변수지않지습다를 지원하지 .TRUNCATE구문 - 해당 구문을 잘라내는 유일한 방법은 범위를 벗어나도록 하는 것입니다.

임시 테이블과 테이블 변수는 저장 프로시저에서 사용될 때 모두 캐시될 수 있으며 아래는 실제 드롭 및 생성이 아닌 잘라낸 후 사용되는 동일한 테이블 변수로 끝날 수 있습니다.

CREATE PROC dbo.foo @start INT
AS
  BEGIN
      DECLARE @tableVariable TABLE (
        id    INT,
        value VARCHAR(20))

      INSERT INTO @tableVariable
                  (id,
                   value)
      SELECT id,
             value
      FROM   xTable
      WHERE  id = @start;
  --Use @tableVariable 
  END

GO

WHILE @start <= @stop
  BEGIN
      EXEC dbo.foo @start

      SET @start = @start + 1
  END 

물론 훨씬 더 쉬운 대안은 사용하는 것으로 바꾸는 것입니다.#temp 되는 테이블입니다.TRUNCATE직접적으로.

은 ""에 씁니다.tempdb트잭션로그가전여있으로 전환할 TRUNCATEDELETE관련된 데이터의 크기에 따라 달라집니다. TRUNCATE페이지 할당 취소만 기록합니다. DELETE실제 삭제된 값을 기록합니다.둘 사이의 또 다른 차이점은TRUNCATE테이블에서 마지막 페이지의 할당을 해제합니다.DELETEDoesn't.각 루프 반복에서 소량의 데이터만 삽입 및 삭제되는 경우 삭제된 행 로깅으로 인한 오버헤드가 테이블의 단일 페이지의 지속적인 할당 취소 및 재할당으로 인한 오버헤드보다 을 수 있습니다.

반대로 각 반복에서 대량의 데이터를 삽입하고 삭제할 경우 다음을 발견할 수 있습니다.TRUNCATE모든 행을 삭제하는 작업을 보다 효율적으로 수행할 수 있을 만 아니라 이후 삽입 문에도 도움이 될 수 있습니다.

이는 테이블 변수의 다른 제한 사항입니다.테이블의 ID를 재설정해야 하는 경우 대부분 잘라내기 명령을 사용합니다.커서 내부의 테이블 변수에 값을 삽입하고 각 삽입마다 새 ID가 채워지므로 테이블 변수를 지워야 한다고 가정합니다.이러한 시나리오에서는 #temp를 사용하여 커서의 각 가져오기에 대한 새 ID를 얻어야 합니다.

--Usage: exec sp_truncateifexists tablename
CREATE PROCEDURE sp_truncateifexists
    @tableVariable nvarchar(200)
AS
BEGIN
    IF EXISTS (
        SELECT 1 
        FROM INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_NAME = @tableVariable )
    BEGIN
        DECLARE @query nvarchar(250)
        SET @query = 'TRUNCATE TABLE ' + @tableVariable 
        EXECUTE (@query)
    END
END
GO

나중에 테이블이 필요하지 않으면 #temp tables를 사용해야 합니다.

이것이 오래된 질문이라는 것을 알지만, 저는 이것을 할 방법을 찾았습니다.수백만 개의 행이 있는 테이블이 있으며 트랜잭션 로그 공간 때문에 테이블을 삭제하고 싶지 않았습니다.

잘라낼 테이블 이름으로 전달할 프로시저를 만듭니다. 프로시저는 잘라낸 다음 절차를 삭제하는 다른 프로시저를 만듭니다.

USE [My_Database]
GO
/****** Object:  StoredProcedure [dbo].[ClearOutTable_p1]    Script Date: 23/09/2015 09:03:14 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:      Oraclebhoy
-- Create date: 23/09/2015
-- Description: 
-- 
-- removes the content of the table passed in through the parameter
-- =============================================
create procedure [dbo].[ClearOutTable_p1]
@tablename varchar(max)
as

-- CREATE THE TRUNCATE STATEMENT PASSING IN TABLE VARIABLE
    declare @truncatesql varchar(max)
    set @truncatesql = 'truncate table ' + @tablename

-- IF PROCEDURE EXISTS DROP
    if exists (select name from sys.all_objects where name = 'ClearOutTable_TEMP'and type = 'P')
        begin
            drop procedure [dbo].[ClearOutTable_TEMP]
        end

-- CREATE TEMP PROCEDURE
    exec ('create procedure [dbo].[ClearOutTable_TEMP]
    as
    '+@truncatesql+'')

-- EXECUTE THE PROCEDURE
    exec [dbo].[ClearOutTable_TEMP]

-- DROP THE PROCEDURE
    drop procedure [dbo].[ClearOutTable_TEMP]

이게 도움이 되길 바랍니다.

언급URL : https://stackoverflow.com/questions/22046487/truncate-clear-table-variable-in-sql-server-2008