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의 답변을 참조하십시오 .
변수 (예 :) 에 Identity-Field가 있고이 테이블을 다시 사용 하려는 경우 " 기술적으로 "정답을 추가 하겠습니다. 루프) 여전히 범위 내에 있으며 다시 시드 할 방법이 없습니다.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
Of course a far easier alternative would be to switch to using a #temp
table instead as that supports TRUNCATE
directly.
DML on both table variables and temp tables writes to the tempdb
transaction log. Whether or not it is worth switching to TRUNCATE
rather than DELETE
depends on the size of data involved. TRUNCATE
will just log the page deallocations. DELETE
will log the actual deleted values. One other difference between the two is that TRUNCATE
deallocates the last page from the table and DELETE
doesn't. If only a small quantity of data is inserted and deleted in each loop iteration then the overhead from logging the deleted rows can be less than the overhead from constantly deallocating and reallocating the single page in the table.
Conversely if you will be inserting and deleting large amounts of data on each iteration you may find that TRUNCATE
not only makes the operation of deleting all rows more efficient but also can benefit the subsequent insert statement.
I know this is an old question but i've figured a way to do this. we had tables with millions of rows and didn't want to delete them due to transaction log space.
Create a procedure that you pass in the table name you want to truncate, the procedure will create another procedure that does the trucate and then deletes the procedures.
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]
Hope this helps.
참고URL : https://stackoverflow.com/questions/22046487/truncate-clear-table-variable-in-sql-server-2008
'Program Tip' 카테고리의 다른 글
데이터를 업데이트하는 SQL MERGE 문 (0) | 2020.12.07 |
---|---|
장고 쿼리는 마지막 n 레코드를 가져옵니다. (0) | 2020.12.07 |
컴파일러가 분명히 초기화되지 않은 변수를 감지하지 못함 (0) | 2020.12.07 |
MS-SQL Server에서 별칭이 지정된 열에 대해 GROUP BY를 수행하려면 어떻게합니까? (0) | 2020.12.07 |
파이썬에서 __main__ 모듈의 파일 이름을 얻는 방법은 무엇입니까? (0) | 2020.12.07 |