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
트잭션로그가전여있으로 전환할 TRUNCATE
DELETE
관련된 데이터의 크기에 따라 달라집니다. TRUNCATE
페이지 할당 취소만 기록합니다. DELETE
실제 삭제된 값을 기록합니다.둘 사이의 또 다른 차이점은TRUNCATE
테이블에서 마지막 페이지의 할당을 해제합니다.DELETE
Doesn'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
'programing' 카테고리의 다른 글
WPF에는 네이티브 파일 대화 상자가 있습니까? (0) | 2023.05.29 |
---|---|
함수 및 함수 매개변수에 설명을 추가하는 방법은 무엇입니까? (0) | 2023.05.24 |
jquery를 사용하여 확인란을 선택/해제하시겠습니까? (0) | 2023.05.24 |
제약 조건을 사용하도록 설정하지 못했습니다.하나 이상의 행에 null이 아니거나 고유하거나 외래 키 제약 조건을 위반하는 값이 포함되어 있습니다. (0) | 2023.05.24 |
구성 파일에서 서버에 대한 기본 호스트 및 포트 설정 (0) | 2023.05.24 |