2016-06-19 13 views
0

Ich möchte mehrere Tabellen abschneiden. Ich weiß, dass es auf die gleiche Weise nicht möglich ist, DELETE wird die Zeilen aus mehreren Tabellen löschen.TRUNCATE mehrere Tabellen SQL Server 2014

In dieser Frage truncate multi tables IndoKnight bietet die OP-designierte beste Antwort. Ich möchte das versuchen. Allerdings bekomme ich einen Syntaxfehler bei:

TRUNCATE TABLE @tableName 

zu beheben habe ich versucht, die Variablen Druck, denn wenn ich versuchte zunächst TRUNCATE TABLE mit brauchte ich den Namen der Datenbank und das Schema (z NuggetDemoDB.dbo.tablename) aufzunehmen, um es an die Arbeit. Ich kann die Variable @tableList drucken. Aber ich kann nicht drucken @tableName.

DECLARE @delimiter CHAR(1), 
    @tableList VARCHAR(MAX), 
    @tableName VARCHAR(20), 
    @currLen INT 

SET @delimiter = ',' 

SET @tableList = 'Employees,Products,Sales' 
--PRINT @tableList 

WHILE LEN(@tableList) > 0 
BEGIN 
SELECT @currLen = 
(
    CASE charindex(@delimiter, @tableList) 
     WHEN 0 THEN len(@tableList ) 
     ELSE (charindex(@delimiter, @tableList ) -1) 
    END 
) 

SET @tableName = SUBSTRING (@tableList,1,@currLen) 
--PRINT @tableName 
TRUNCATE TABLE @tableName 

SELECT tableList = 
(
    CASE (len(@tableList) - @currLen ) 
     WHEN 0 THEN '' 
     ELSE right(@tableList, len(@tableList) - @currLen - 1) 
    END 
) 
END 

Edit: die Tabellenliste behoben, die extra „Verkauf“ aus der Liste der Tabellen und fügte hinzu: „Mitarbeiter“ zu entfernen.

+0

Sie können Kennungen nicht parametrisieren. Ich bin irgendwie überrascht, dass dies niemand als Kommentar zu der Antwort geschrieben hat, mit der Sie verbunden sind. Sie müssen entweder eine andere Truncate-Anweisung für jede Tabelle oder dynamische SQL verwenden. –

+0

Sie müssen ein wenig dynamisches SQL verwenden, um durch jede Tabelle zu iterieren. – Yobik

+0

Eigentlich können Sie die Tabellenliste automatisieren. sys.objects und sys.tables sind gute Startpunkte. Verwenden Sie QUOTENAME (, '[]') –

Antwort

1

Auch dachte Verkauf zweimal aufgeführt wird ... Kein Schaden

Declare @TableList varchar(max) 
SET @tableList = 'Sales,Products,Sales' 
Set @tableList = 'Truncate Table '+replace(@tablelist,',',';Truncate Table ')+';' 
Print @TableList 

--Exec(@tablelist) --<< If you are TRULY comfortable with the results 

Returns

Truncate Table Sales;Truncate Table Products;Truncate Table Sales 
1

Im Folgenden ist ein Beispiel, das eine Tabelle Variable statt getrennter Liste verwendet. Wenn sich die Quelle Ihrer Tabellenliste bereits in einer Tabelle befindet, können Sie dieses Skript optimieren, um es stattdessen als Quelle zu verwenden. Beachten Sie, dass die zusätzliche Verkaufstabelle redundant ist (aus dem Skript Ihrer Frage) und entfernt werden kann. Die Tabellennamen können auf Wunsch Datenbank- und/oder Schema-qualifiziert sein.

DECLARE @tableList TABLE(TableName nvarchar(393)); 
DECLARE @TruncateTableBatch nvarchar(MAX); 
INSERT INTO @tableList VALUES 
     (N'Sales') 
    , (N'Products') 
    , (N'Sales'); 

SET @TruncateTableBatch = (SELECT N'TRUNCATE TABLE ' + TableName + N' 
' 
FROM @tableList 
FOR XML PATH(''), TYPE).value('.', 'nvarchar(MAX)'); 

--PRINT @SQL; 
EXECUTE(@TruncateTableBatch); 
0

Was ist so etwas wie: 'Tabelle gestutzt'

exec sp_msforeachtable @ command1 = , @ whereand = 'und object_id In (wählen object_id von sys.objects wo Namen in ("Umsatz", "Produkte")'

habe es noch nicht getestet. Aber es könnte einen nützlichen Hinweis geben.

+0

Zusätzlich: Wenn Sie einige Fremdschlüsselverstöße während des Abschneidens haben, können Sie mithilfe eines Skripts create -Anweisungen generieren, sie in tempdb speichern, die Fremdschlüssel löschen, abschneiden und wiederherstellen die Fremdschlüssel von Tempdb. Andernfalls können Sie beim Abschneiden die Reihenfolge der Tabellen beibehalten. Sie können sich die "Löschkaskade" für Fremdschlüssel ansehen. Vielleicht ist es für Sie interessant: https://www.mssqltips.com/sqlservertip/2743/using-delete-cascade-option-for-foreign-keys/ – Sven

2

In erster Linie möchten Sie möglicherweise etwas Energie für eine SQL-Implementierung ausgeben, um eine Zeichenfolge in Zeilen aufzuteilen, z. B. Split, List usw. Dies wird sich nicht nur für diese Übung, sondern für viele als hilfreich erweisen In diesem Beitrag geht es nicht darum, wie man eine kommagetrennte Liste in Zeilen umwandelt, und wir können uns dann auf das dynamische SQL konzentrieren, das benötigt wird, um das zu tun, was benötigt wird.

Beispiel

Im folgenden Beispiel wird davon ausgegangen, dass Sie über eine Funktion namens List verfügen, die dafür sorgt, dass die durch Kommas getrennte Liste in Zeilen transponiert wird.

declare 
    @TableList varchar(max) = 'Sales, Products, Sales'; 

declare 
    @Sql varchar(max) = (
     select distinct 'truncate table ' + name + ';' 
     from List(@TableList) 
     for xml path('')); 

exec (@Sql); 

Eine letzte Sache über truncate der Lösch-

Kürzen funktioniert nicht, wenn Sie Daten Kürzen, wo es eine Fremdschlüsselbeziehung zu einer anderen Tabelle ist.

Sie erhalten so etwas wie den folgenden Fehler.

Msg 4712, Level 16, State 1, Line 19 
Cannot truncate table 'Something' because it is being referenced by a FOREIGN KEY constraint. 
+0

Schöne Antwort, obwohl es keine Integritätsprüfung gibt. Trotzdem glaube ich, dass wir wissen müssen, wer diesen Prozess benutzt und warum. –