Tabellenvariablen werden nicht unterstützt TRUNCATE
Syntax. Die einzige Möglichkeit, sie abzuschneiden, besteht darin, sie implizit aus dem Gültigkeitsbereich fallen zu lassen.
Sowohl temporäre Tabellen als auch Tabellenvariablen können zwischengespeichert werden, wenn sie in gespeicherten Prozeduren verwendet werden. Im Folgenden wird möglicherweise dieselbe Tabellenvariable nach dem Abschneiden verwendet, anstatt sie tatsächlich zu löschen und zu erstellen
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;
END
GO
WHILE @start <= @stop
BEGIN
EXEC dbo.foo @start
SET @start = @start + 1
END
Eine weitaus einfachere Alternative wäre natürlich die Umstellung auf a #temp
Tabelle zu verwenden, da dies TRUNCATE
direkt unterstützt .
DML für Tabellenvariablen und temporäre Tabellen schreibt in das tempdb
Transaktionsprotokoll. Unabhängig davon , ob es lohnt Umschaltung TRUNCATE
statt , DELETE
hängt von der Größe der betreffenden Daten. TRUNCATE
protokolliert nur die Freigabe der Seite. DELETE
protokolliert die tatsächlich gelöschten Werte. Ein weiterer Unterschied zwischen den beiden besteht darin, dass die TRUNCATE
Zuordnung der letzten Seite aus der Tabelle aufgehoben wird und DELETE
dies nicht der Fall ist. Wenn in jeder Schleifeniteration nur eine kleine Datenmenge eingefügt und gelöscht wird, kann der Aufwand für die Protokollierung der gelöschten Zeilen geringer sein als der Aufwand für die ständige Freigabe und Neuzuweisung der einzelnen Seite in der Tabelle.
Wenn Sie dagegen bei jeder Iteration große Datenmengen einfügen und löschen, werden Sie möglicherweise feststellen, dass TRUNCATE
das Löschen aller Zeilen nicht nur effizienter ist, sondern auch der nachfolgenden Einfügeanweisung zugute kommt .