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 TRUNCATEdirekt unterstützt .
DML für Tabellenvariablen und temporäre Tabellen schreibt in das tempdbTransaktionsprotokoll. Unabhängig davon , ob es lohnt Umschaltung TRUNCATEstatt , DELETEhängt von der Größe der betreffenden Daten. TRUNCATEprotokolliert nur die Freigabe der Seite. DELETEprotokolliert die tatsächlich gelöschten Werte. Ein weiterer Unterschied zwischen den beiden besteht darin, dass die TRUNCATEZuordnung der letzten Seite aus der Tabelle aufgehoben wird und DELETEdies 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 TRUNCATEdas Löschen aller Zeilen nicht nur effizienter ist, sondern auch der nachfolgenden Einfügeanweisung zugute kommt .