DELETE (Transact-SQL)DELETE (Transact-SQL)

DIESES THEMA GILT FÜR: jaSQL Server (ab 2008)jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Entfernt eine oder mehrere Zeilen aus einer Tabelle oder Sicht in SQL ServerSQL Server.Removes one or more rows from a table or view in SQL ServerSQL Server.

Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax

-- Syntax for SQL Server and Azure SQL Database  

[ WITH <common_table_expression> [ ,...n ] ]  
DELETE   
    [ TOP ( expression ) [ PERCENT ] ]   
    [ FROM ]   
    { { table_alias  
      | <object>   
      | rowset_function_limited   
      [ WITH ( table_hint_limited [ ...n ] ) ] }   
      | @table_variable  
    }  
    [ <OUTPUT Clause> ]  
    [ FROM table_source [ ,...n ] ]   
    [ WHERE { <search_condition>   
            | { [ CURRENT OF   
                   { { [ GLOBAL ] cursor_name }   
                       | cursor_variable_name   
                   }   
                ]  
              }  
            }   
    ]   
    [ OPTION ( <Query Hint> [ ,...n ] ) ]   
[; ]  

<object> ::=  
{   
    [ server_name.database_name.schema_name.   
      | database_name. [ schema_name ] .   
      | schema_name.  
    ]  
    table_or_view_name   
}  
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

DELETE FROM [database_name . [ schema ] . | schema. ] table_name    
    [ WHERE <search_condition> ]   
    [ OPTION ( <query_options> [ ,...n ]  ) ]  
[; ]  

ArgumenteArguments

MIT <Common_table_expression >WITH <common_table_expression>
Gibt das temporäre benannte Resultset, auch als allgemeiner Tabellenausdruck bezeichnet, an, das im Rahmen der DELETE-Anweisung definiert wurde.Specifies the temporary named result set, also known as common table expression, defined within the scope of the DELETE statement. Das Resultset wird von einer SELECT-Anweisung abgeleitet.The result set is derived from a SELECT statement.

Allgemeine Tabellenausdrücke können außerdem mit SELECT-, INSERT-, UPDATE- und CREATE VIEW-Anweisungen verwendet werden.Common table expressions can also be used with the SELECT, INSERT, UPDATE, and CREATE VIEW statements. Weitere Informationen finden Sie unter WITH Common_table_expression ( Transact-SQL ) .For more information, see WITH common_table_expression (Transact-SQL).

TOP (Ausdruck) [PERCENT]TOP (expression) [ PERCENT ]
Gibt die Anzahl oder den Prozentsatz willkürlicher Zeilen an, die gelöscht werden.Specifies the number or percent of random rows that will be deleted. expression kann eine Anzahl oder ein Prozentsatz der Zeilen sein.expression can be either a number or a percent of the rows. Die Zeilen, auf die im TOP-Ausdruck für die Anweisung INSERT, UPDATE oder DELETE verwiesen wird, sind nicht auf bestimmte Weise angeordnet.The rows referenced in the TOP expression used with INSERT, UPDATE, or DELETE are not arranged in any order. Weitere Informationen finden Sie unter nach oben ( Transact-SQL ) .For more information, see TOP (Transact-SQL).

FROMFROM
Ein optionales Schlüsselwort, das zwischen dem DELETE-Schlüsselwort und das Ziel verwendet werden kann Table_or_view_name, oder Rowset_function_limited.An optional keyword that can be used between the DELETE keyword and the target table_or_view_name, or rowset_function_limited.

table_aliastable_alias
In der FROM angegebene Alias Table_source Klausel darstellt, die Tabelle oder Sicht aus der Zeilen gelöscht werden soll.The alias specified in the FROM table_source clause representing the table or view from which the rows are to be deleted.

Servernameserver_name
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Der Name des Servers (mithilfe eines Verbindungsservernamens oder der OPENDATASOURCE -Funktion als Servername) auf dem die Tabelle oder Sicht befindet.The name of the server (using a linked server name or the OPENDATASOURCE function as the server name) on which the table or view is located. Wenn Server_name angegeben wird, Database_name und Schema_name erforderlich sind.If server_name is specified, database_name and schema_name are required.

database_namedatabase_name
Der Name der Datenbank.The name of the database.

schema_nameschema_name
Der Name des Schemas, zu dem die Tabelle oder Sicht gehören.The name of the schema to which the table or view belongs.

Table_or view_nametable_or view_name
Der Name der Tabelle oder Sicht, aus der die Zeilen entfernt werden sollen.The name of the table or view from which the rows are to be removed.

In ihrem Gültigkeitsbereich kann eine Tabellenvariable auch als Quelltabelle in einer DELETE-Anweisung verwendet werden.A table variable, within its scope, also can be used as a table source in a DELETE statement.

Die Sicht verweist Table_or_view_name muss aktualisierbar sein und auf genau eine Basistabelle in der FROM-Klausel der Sichtdefinition verweisen.The view referenced by table_or_view_name must be updatable and reference exactly one base table in the FROM clause of the view definition. Weitere Informationen zu aktualisierbaren Sichten finden Sie unter CREATE VIEW ( Transact-SQL ) .For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Entweder die OPENQUERY oder OPENROWSET Funktion, je nach den Funktionen des Anbieters.Either the OPENQUERY or OPENROWSET function, subject to provider capabilities.

MIT ( <Table_hint_limited > [... n] )WITH ( <table_hint_limited> [... n] )
Gibt mindestens einen Tabellenhinweis an, der für eine Zieltabelle zulässig ist.Specifies one or more table hints that are allowed for a target table. Das WITH-Schlüsselwort und die Klammern sind erforderlich.The WITH keyword and the parentheses are required. NOLOCK und READUNCOMMITTED sind nicht zulässig.NOLOCK and READUNCOMMITTED are not allowed. Weitere Informationen zu Tabellenhinweisen finden Sie unter Tabellenhinweise ( Transact-SQL ) .For more information about table hints, see Table Hints (Transact-SQL).

<OUTPUT_Clause ><OUTPUT_Clause>
Gibt gelöschte Zeilen bzw. auf diesen basierende Ausdrücke als Teil der DELETE-Operation zurück.Returns deleted rows, or expressions based on them, as part of the DELETE operation. Die OUTPUT-Klausel wird in DML-Anweisungen, deren Ziel Sichten oder Remotetabellen sind, nicht unterstützt.The OUTPUT clause is not supported in any DML statements targeting views or remote tables. Weitere Informationen finden Sie unter OUTPUT-Klausel ( Transact-SQL ) .For more information, see OUTPUT Clause (Transact-SQL).

VON Table_sourceFROM table_source
Gibt eine zusätzliche FROM-Klausel an.Specifies an additional FROM clause. Dies Transact-SQLTransact-SQL -Erweiterung für DELETE ermöglicht, Daten aus <Table_source > und das Löschen der entsprechenden Zeilen aus der Tabelle in der ersten FROM Klausel.This Transact-SQLTransact-SQL extension to DELETE allows specifying data from <table_source> and deleting the corresponding rows from the table in the first FROM clause.

Diese Erweiterung, die einen Join angibt, kann anstelle einer Unterabfrage in der WHERE-Klausel verwendet werden, um zu entfernende Zeilen zu identifizieren.This extension, specifying a join, can be used instead of a subquery in the WHERE clause to identify rows to be removed.

Weitere Informationen finden Sie unter FROM (Transact-SQL).For more information, see FROM (Transact-SQL).

WHEREWHERE
Gibt die Bedingungen an, die zur Beschränkung der Anzahl der gelöschten Zeilen verwendet werden.Specifies the conditions used to limit the number of rows that are deleted. Wird keine WHERE-Klausel angegeben, werden mit DELETE alle Zeilen aus der Tabelle entfernt.If a WHERE clause is not supplied, DELETE removes all the rows from the table.

Es gibt zwei Formen von Löschoperationen, die darauf basieren, was in der WHERE-Klausel angegeben wird:There are two forms of delete operations based on what is specified in the WHERE clause:

  • Gesuchte Löschungen geben eine Suchbedingung an, um die zu löschenden Zeilen zu kennzeichnen.Searched deletes specify a search condition to qualify the rows to delete. Zum Beispiel, in dem Column_name = Wert.For example, WHERE column_name = value.

  • Positionierte Löschungen verwenden die CURRENT OF-Klausel, um einen Cursor anzugeben.Positioned deletes use the CURRENT OF clause to specify a cursor. Die Löschoperation wird an der aktuellen Position des Cursors ausgeführt.The delete operation occurs at the current position of the cursor. Dies kann genauer sein als eine gesuchte DELETE-Anweisung, die eine WHERE verwendet Search_condition -Klausel, um die zu löschenden Zeilen zu qualifizieren.This can be more accurate than a searched DELETE statement that uses a WHERE search_condition clause to qualify the rows to be deleted. Eine gesuchte DELETE-Anweisung löscht mehrere Zeilen, wenn die Suchbedingung nicht eindeutig eine einzelne Zeile identifiziert.A searched DELETE statement deletes multiple rows if the search condition does not uniquely identify a single row.

<Search_condition ><search_condition>
Gibt die Einschränkungsbedingungen für die zu löschenden Zeilen an.Specifies the restricting conditions for the rows to be deleted. Es gibt keinen Höchstwert hinsichtlich der Anzahl von Prädikaten in einer Suchbedingung.There is no limit to the number of predicates that can be included in a search condition. Weitere Informationen finden Sie unter Suchbedingung ( Transact-SQL ) .For more information, see Search Condition (Transact-SQL).

CURRENT OFCURRENT OF
Gibt an, dass DELETE an der aktuellen Position des angegebenen Cursors durchgeführt wird.Specifies that the DELETE is performed at the current position of the specified cursor.

GLOBALGLOBAL
Gibt an, dass Cursor_name auf einen globalen Cursor verweist.Specifies that cursor_name refers to a global cursor.

Cursornamecursor_name
Der Name des geöffneten Cursors, von dem der Abruf erfolgt.Is the name of the open cursor from which the fetch is made. Wenn sowohl ein globaler als auch ein lokaler Cursor mit dem Namen Cursor_name vorhanden ist, dieses Argument bezieht sich auf den globalen Cursor, wenn GLOBAL angegeben; andernfalls ist, bezieht sich auf den lokalen Cursor.If both a global and a local cursor with the name cursor_name exist, this argument refers to the global cursor if GLOBAL is specified; otherwise, it refers to the local cursor. Der Cursor muss Updates zulassen.The cursor must allow updates.

cursor_variable_namecursor_variable_name
Der Name einer Cursorvariablen.The name of a cursor variable. Die Cursorvariable muss auf einen Cursor verweisen, der Updates zulässt.The cursor variable must reference a cursor that allows updates.

OPTION ( <Query_hint > [ ,... n] )OPTION ( <query_hint> [ ,... n] )
Schlüsselwörter, die angeben, welche Optimierungshinweise verwendet werden, wie die DatenbankmodulDatabase Engine verarbeitet die Anweisung.Keywords that indicate which optimizer hints are used to customize the way the DatenbankmodulDatabase Engine processes the statement. Weitere Informationen finden Sie unter Abfragehinweise (Transact-SQL).For more information, see Query Hints (Transact-SQL).

Bewährte MethodenBest Practices

Um alle Zeilen in einer Tabelle zu löschen, verwenden Sie TRUNCATE TABLE.To delete all the rows in a table, use TRUNCATE TABLE. TRUNCATE TABLE ist schneller als DELETE und verwendet weniger Systemressourcen und Ressourcen für die Transaktionsprotokollierung.TRUNCATE TABLE is faster than DELETE and uses fewer system and transaction log resources. Für TRUNCATE TABLE gelten Einschränkungen, beispielsweise kann die Tabelle nicht in Replikationen verwendet werden.TRUNCATE TABLE has restrictions, for example, the table cannot participate in replication. Weitere Informationen finden Sie unter TRUNCATE TABLE ( Transact-SQL )For more information, see TRUNCATE TABLE (Transact-SQL)

Verwenden der @@ROWCOUNT Funktion zum Zurückgeben der Anzahl der gelöschten Zeilen an die Clientanwendung.Use the @@ROWCOUNT function to return the number of deleted rows to the client application. Weitere Informationen finden Sie unter @@ROWCOUNT ( Transact-SQL ) .For more information, see @@ROWCOUNT (Transact-SQL).

FehlerbehandlungError Handling

Sie können die Fehlerbehandlung für die DELETE-Anweisung durch Angeben der Anweisung in einem TRY…CATCH-Konstrukt implementieren.You can implement error handling for the DELETE statement by specifying the statement in a TRY…CATCH construct.

Die DELETE-Anweisung erzeugt möglicherweise einen Fehler, wenn sie gegen einen Trigger verstößt oder versucht, eine Zeile zu entfernen, auf die von Daten einer anderen Tabelle mit einer FOREIGN KEY-Einschränkung verwiesen wird.The DELETE statement may fail if it violates a trigger or tries to remove a row referenced by data in another table with a FOREIGN KEY constraint. Entfernt die DELETE-Anweisung mehrere Zeilen und verstößt eine der entfernten Zeilen gegen einen Trigger oder eine Einschränkung, wird die Anweisung abgebrochen, ein Fehler gemeldet und keine Zeilen entfernt.If the DELETE removes multiple rows, and any one of the removed rows violates a trigger or constraint, the statement is canceled, an error is returned, and no rows are removed.

Wenn in einer DELETE-Anweisung bei der Auswertung eines Ausdrucks ein arithmetischer Fehler (Überlauf, Division durch null oder Domänenfehler) auftritt, behandelt DatenbankmodulDatabase Engine den Fehler so, als wäre SET ARITHABORT auf ON festgelegt.When a DELETE statement encounters an arithmetic error (overflow, divide by zero, or a domain error) occurring during expression evaluation, the DatenbankmodulDatabase Engine handles these errors as if SET ARITHABORT is set ON. Der Rest des Batches wird abgebrochen, und eine Fehlermeldung wird zurückgegeben.The rest of the batch is canceled, and an error message is returned.

InteroperabilitätInteroperability

DELETE kann im Textkörper einer benutzerdefinierten Funktion verwendet werden, wenn es sich bei dem geänderten Objekt um eine Tabellenvariable handelt.DELETE can be used in the body of a user-defined function if the object modified is a table variable.

Wenn Sie eine Zeile mit einer FILESTREAM-Spalte löschen, löschen Sie auch die zugrunde liegenden Dateisystemdateien.When you delete a row that contains a FILESTREAM column, you also delete its underlying file system files. Die zugrunde liegenden Dateien werden vom FILESTREAM Garbage Collector entfernt.The underlying files are removed by the FILESTREAM garbage collector. Weitere Informationen finden Sie unter zugreifen auf FILESTREAM-Daten mit Transact-SQL.For more information, see Access FILESTREAM Data with Transact-SQL.

Die FROM-Klausel kann nicht für eine DELETE-Anweisung angegeben werden, die entweder direkt oder indirekt auf eine Sicht verweist, für die ein INSTEAD OF-Trigger definiert wurde.The FROM clause cannot be specified in a DELETE statement that references, either directly or indirectly, a view with an INSTEAD OF trigger defined on it. Weitere Informationen zu INSTEAD OF-Trigger finden Sie unter CREATE TRIGGER ( Transact-SQL ) .For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

EinschränkungenLimitations and Restrictions

Wenn TOP mit ENTF verwendet wird, werden die Zeilen, auf die verwiesen wird, nicht auf bestimmte Weise angeordnet, und die ORDER BY-Klausel kann in dieser Anweisung nicht direkt angegeben werden.When TOP is used with DELETE, the referenced rows are not arranged in any order and the ORDER BY clause can not be directly specified in this statement. Wenn Sie die TOP-Klausel verwenden müssen, um Zeilen in einer sinnvollen Reihenfolge zu löschen, müssen Sie sie zusammen mit einer ORDER BY-Klausel in einer untergeordneten SELECT-Anweisung verwenden.If you need to use TOP to delete rows in a meaningful chronological order, you must use TOP together with an ORDER BY clause in a subselect statement. Weitere Informationen finden Sie im Abschnitt "Beispiele" in diesem Thema.See the Examples section that follows in this topic.

TOP kann nicht in einer DELETE-Anweisung mit partitionierten Sichten verwendet werden.TOP cannot be used in a DELETE statement against partitioned views.

SperrverhaltenLocking Behavior

Eine DELETE-Anweisung ruft immer eine exklusive (X) Sperre für die von ihr geänderte Tabelle ab und hält diese Sperre bis zum Abschluss der Transaktion aufrecht.By default, a DELETE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes. Eine exklusive Sperre (X) bewirkt, dass keine andere Transaktion Daten ändern kann. Lesevorgänge können nur mithilfe des NOLOCK-Hinweises oder der READ UNCOMMITTED-Isolationsstufe ausgeführt werden.With an exclusive (X) lock, no other transactions can modify data; read operations can take place only with the use of the NOLOCK hint or read uncommitted isolation level. Sie können Tabellenhinweise angeben, um dieses Standardverhalten für die Dauer der DELETE-Anweisung zu überschreiben, indem Sie eine andere Sperrmethode angeben. Es wird jedoch empfohlen, dass Hinweise nur von erfahrenen Entwicklern und Datenbankadministratoren und nur als letzte Möglichkeit verwendet werden.You can specify table hints to override this default behavior for the duration of the DELETE statement by specifying another locking method, however, we recommend that hints be used only as a last resort by experienced developers and database administrators. Weitere Informationen finden Sie unter Tabellenhinweise (Transact-SQL).For more information, see Table Hints (Transact-SQL).

Wenn Zeilen aus einem Heap gelöscht werden, können von DatenbankmodulDatabase Engine Zeilen- oder Seitensperren für den Vorgang verwendet werden.When rows are deleted from a heap the DatenbankmodulDatabase Engine may use row or page locking for the operation. Demzufolge bleiben die durch den Löschvorgang geleerten Seiten dem Heap zugeordnet.As a result, the pages made empty by the delete operation remain allocated to the heap. Wenn die Zuordnung leerer Seiten nicht aufgehoben wird, kann der zugehörige Speicherplatz nicht für andere Objekte in der Datenbank verwendet werden.When empty pages are not deallocated, the associated space cannot be reused by other objects in the database.

Verwenden Sie eine der folgenden Methoden, um Zeilen in einem Heap zu löschen und die Zuordnung der Seiten aufzuheben:To delete rows in a heap and deallocate pages, use one of the following methods.

  • Geben Sie den TABLOCK-Hinweis in der DELETE-Anweisung an.Specify the TABLOCK hint in the DELETE statement. Mithilfe des TABLOCK-Hinweises wird durch den Löschvorgang eine exklusive Sperre für die Tabelle statt einer Zeilen- oder Seitensperre angefordert.Using the TABLOCK hint causes the delete operation to take an exclusive lock on the table instead of a row or page lock. Dadurch ist es möglich, die Zuordnung der Seiten aufzuheben.This allows the pages to be deallocated. Weitere Informationen zum TABLOCK-Hinweis finden Sie unter Tabellenhinweise ( Transact-SQL ) .For more information about the TABLOCK hint, see Table Hints (Transact-SQL).

  • Verwenden Sie TRUNCATE TABLE, wenn alle Zeilen aus der Tabelle gelöscht werden sollen.Use TRUNCATE TABLE if all rows are to be deleted from the table.

  • Erstellen Sie einen gruppierten Index für den Heap, bevor Sie die Zeilen löschen.Create a clustered index on the heap before deleting the rows. Nach dem Löschen der Zeilen können Sie den gruppierten Index löschen.You can drop the clustered index after the rows are deleted. Diese Methode ist zeitaufwändiger als die vorherigen Methoden und beansprucht mehr temporäre Ressourcen.This method is more time consuming than the previous methods and uses more temporary resources.

Hinweis

Leere Seiten können entfernt werden aus einem Heap zu einem beliebigen Zeitpunkt mithilfe der ALTER TABLE <table_name> REBUILD Anweisung.Empty pages can be removed from a heap at any time by using the ALTER TABLE <table_name> REBUILD statement.

ProtokollierungsverhaltenLogging Behavior

Die DELETE-Anweisung wird immer vollständig protokolliert.The DELETE statement is always fully logged.

SicherheitSecurity

BerechtigungenPermissions

Für die Zieltabelle sind DELETE-Berechtigungen erforderlich.DELETE permissions are required on the target table. SELECT-Berechtigungen werden ebenfalls benötigt, wenn die Anweisung eine WHERE-Klausel enthält.SELECT permissions are also required if the statement contains a WHERE clause.

Löschen von Berechtigungen erhalten standardmäßig Mitglieder der der Sysadmin festen Serverrolle, die Db_owner und Db_datawriter festen Datenbankrollen und der Besitzer der Tabelle.DELETE permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. Mitglieder der Sysadmin, Db_owner, und die Db_securityadmin Rollen sowie der Tabellenbesitzer können Berechtigungen an andere Benutzer übertragen.Members of the sysadmin, db_owner, and the db_securityadmin roles, and the table owner can transfer permissions to other users.

BeispieleExamples

KategorieCategory FunktionssyntaxelementeFeatured syntax elements
Grundlegende syntaxBasic syntax DELETEDELETE
Die gelöschten Zeilen beschränkenLimiting the rows deleted WHERE • FROM • Cursor •WHERE • FROM • cursor •
Löschen von Zeilen aus einer RemotetabelleDeleting rows from a remote table Verbindungsserver • OPENQUERY-Rowsetfunktion • OPENDATASOURCE-RowsetfunktionLinked server • OPENQUERY rowset function • OPENDATASOURCE rowset function
Erfassen der Ergebnisse der DELETE-AnweisungCapturing the results of the DELETE statement OUTPUT-KlauselOUTPUT clause

Grundlegende Syntax Basic Syntax

Anhand von Beispielen in diesem Abschnitt wird die grundlegende Funktion der DELETE-Anweisung mithilfe der mindestens erforderlichen Syntax veranschaulicht.Examples in this section demonstrate the basic functionality of the DELETE statement using the minimum required syntax.

A.A. Verwenden von DELETE ohne WHERE-KlauselUsing DELETE with no WHERE clause

Im folgenden Beispiel werden alle Zeilen aus der SalesPersonQuotaHistory-Tabelle in der AdventureWorks2012AdventureWorks2012-Datenbank gelöscht, da keine WHERE-Klausel verwendet wird, um die Anzahl der gelöschten Zeilen zu begrenzen.The following example deletes all rows from the SalesPersonQuotaHistory table in the AdventureWorks2012AdventureWorks2012 database because a WHERE clause is not used to limit the number of rows deleted.

DELETE FROM Sales.SalesPersonQuotaHistory;  
GO  

Die gelöschten Zeilen beschränken Limiting the Rows Deleted

In den Beispielen in diesem Abschnitt wird veranschaulicht, wie die Anzahl von Zeilen beschränkt wird, die gelöscht werden.Examples in this section demonstrate how to limit the number of rows that will be deleted.

B.B. Löschen einer Reihe von Zeilen mithilfe der WHERE-KlauselUsing the WHERE clause to delete a set of rows

Das folgende Beispiel löscht alle Zeilen aus der ProductCostHistory -Tabelle in der AdventureWorks2012AdventureWorks2012 Datenbank, in der der Wert in der StandardCost Spalte ist mehr als 1000.00.The following example deletes all rows from the ProductCostHistory table in the AdventureWorks2012AdventureWorks2012 database in which the value in the StandardCost column is more than 1000.00.

DELETE FROM Production.ProductCostHistory  
WHERE StandardCost > 1000.00;  
GO  

Im folgenden Beispiel wird eine komplexere WHERE-Klausel veranschaulicht.The following example shows a more complex WHERE clause. Die WHERE-Klausel definiert zwei Bedingungen, die erfüllt werden müssen, um die zu löschenden Zeilen zu bestimmen.The WHERE clause defines two conditions that must be met to determine the rows to delete. Der Wert in der StandardCost -Spalte muss zwischen 12.00 und 14.00 liegen, und der Wert in der SellEndDate -Spalte muss NULL sein.The value in the StandardCost column must be between 12.00 and 14.00 and the value in the column SellEndDate must be null. Das Beispiel gibt außerdem den Wert aus der @@ROWCOUNT Funktion zum Zurückgeben der Anzahl der gelöschten Zeilen.The example also prints the value from the @@ROWCOUNT function to return the number of deleted rows.

DELETE Production.ProductCostHistory  
WHERE StandardCost BETWEEN 12.00 AND 14.00  
      AND EndDate IS NULL;  
PRINT 'Number of rows deleted is ' + CAST(@@ROWCOUNT as char(3));  

C.C. Bestimmen der zu löschenden Zeile mithilfe eines CursorsUsing a cursor to determine the row to delete

Das folgende Beispiel löscht eine einzelne Zeile aus der EmployeePayHistory -Tabelle in der AdventureWorks2012AdventureWorks2012 Datenbank mithilfe eines Cursors, der mit dem Namen mycursor.The following example deletes a single row from the EmployeePayHistory table in the AdventureWorks2012AdventureWorks2012 database using a cursor named mycursor. Von der Löschoperation ist nur die Zeile betroffen, die aktuell durch den Cursor abgerufen wird.The delete operation affects only the single row currently fetched from the cursor.

DECLARE complex_cursor CURSOR FOR  
    SELECT a.BusinessEntityID  
    FROM HumanResources.EmployeePayHistory AS a  
    WHERE RateChangeDate <>   
         (SELECT MAX(RateChangeDate)  
          FROM HumanResources.EmployeePayHistory AS b  
          WHERE a.BusinessEntityID = b.BusinessEntityID) ;  
OPEN complex_cursor;  
FETCH FROM complex_cursor;  
DELETE FROM HumanResources.EmployeePayHistory  
WHERE CURRENT OF complex_cursor;  
CLOSE complex_cursor;  
DEALLOCATE complex_cursor;  
GO  

D.D. Verwenden von Joins und Unterabfragen für Daten in einer Tabelle, um Zeilen in einer anderen Tabelle zu löschenUsing joins and subqueries to data in one table to delete rows in another table

In den folgenden Beispielen werden zwei Möglichkeiten veranschaulicht, Zeilen in einer Tabelle anhand von Daten in einer anderen Tabelle zu löschen.The following examples show two ways to delete rows in one table based on data in another table. In beiden Beispielen werden Zeilen aus der SalesPersonQuotaHistory -Tabelle in der AdventureWorks2012AdventureWorks2012 Datenbank werden gelöscht, basierend auf der Year-to-Date Sales gespeichert, der SalesPerson Tabelle.In both examples, rows from the SalesPersonQuotaHistory table in the AdventureWorks2012AdventureWorks2012 database are deleted based on the year-to-date sales stored in the SalesPerson table. Die erste DELETE Anweisung zeigt die Lösung mit einer ISO-kompatiblen Unterabfrage, die zweite DELETE -Anweisung zeigt die Transact-SQLTransact-SQL FROM-Erweiterung zum Verknüpfen der beiden Tabellen.The first DELETE statement shows the ISO-compatible subquery solution, and the second DELETE statement shows the Transact-SQLTransact-SQL FROM extension to join the two tables.

-- SQL-2003 Standard subquery  

DELETE FROM Sales.SalesPersonQuotaHistory   
WHERE BusinessEntityID IN   
    (SELECT BusinessEntityID   
     FROM Sales.SalesPerson   
     WHERE SalesYTD > 2500000.00);  
GO  
-- Transact-SQL extension  

DELETE FROM Sales.SalesPersonQuotaHistory   
FROM Sales.SalesPersonQuotaHistory AS spqh  
INNER JOIN Sales.SalesPerson AS sp  
ON spqh.BusinessEntityID = sp.BusinessEntityID  
WHERE sp.SalesYTD > 2500000.00;  
GO  
-- No need to mention target table more than once.  

DELETE spqh  
  FROM  
        Sales.SalesPersonQuotaHistory AS spqh  
    INNER JOIN Sales.SalesPerson AS sp  
        ON spqh.BusinessEntityID = sp.BusinessEntityID  
  WHERE  sp.SalesYTD > 2500000.00;  

E.E. Verwenden von TOP, um die Anzahl der zu löschenden Zeilen einzuschränkenUsing TOP to limit the number of rows deleted

Wenn eine TOP (n)-Klausel wird zusammen mit DELETE verwendet, der Löschvorgang wird ausgeführt, auf eine zufällige Auswahl von n Zeilen.When a TOP (n) clause is used with DELETE, the delete operation is performed on a random selection of n number of rows. Das folgende Beispiel löscht 20 zufällige Zeilen aus der PurchaseOrderDetail -Tabelle in der AdventureWorks2012AdventureWorks2012 Datenbank, die Fälligkeitsdaten Datumsangaben, die vor dem 1. Juli 2006 sind.The following example deletes 20 random rows from the PurchaseOrderDetail table in the AdventureWorks2012AdventureWorks2012 database that have due dates that are earlier than July 1, 2006.

DELETE TOP (20)   
FROM Purchasing.PurchaseOrderDetail  
WHERE DueDate < '20020701';  
GO  

Wenn Sie die TOP-Klausel verwenden müssen, um Zeilen in einer sinnvollen Reihenfolge zu löschen, müssen Sie sie zusammen mit ORDER BY in einer untergeordneten SELECT-Anweisung verwenden.If you have to use TOP to delete rows in a meaningful chronological order, you must use TOP together with ORDER BY in a subselect statement. Die folgende Abfrage löscht die zehn Zeilen der PurchaseOrderDetail -Tabelle mit den frühesten Fälligkeitsdaten.The following query deletes the 10 rows of the PurchaseOrderDetail table that have the earliest due dates. Die in der untergeordneten SELECT-Anweisung angegebene Spalte (PurchaseOrderID) ist der Primärschlüssel der Tabelle, um sicherzustellen, dass nur 10 Zeilen gelöscht werden.To ensure that only 10 rows are deleted, the column specified in the subselect statement (PurchaseOrderID) is the primary key of the table. Wird in der untergeordneten SELECT-Anweisung eine Nichtschlüsselspalte verwendet, werden möglicherweise mehr als 10 Zeilen gelöscht, wenn die angegebene Spalte doppelte Werte enthält.Using a nonkey column in the subselect statement may result in the deletion of more than 10 rows if the specified column contains duplicate values.

DELETE FROM Purchasing.PurchaseOrderDetail  
WHERE PurchaseOrderDetailID IN  
   (SELECT TOP 10 PurchaseOrderDetailID   
    FROM Purchasing.PurchaseOrderDetail   
    ORDER BY DueDate ASC);  
GO  

Löschen von Zeilen aus einer Remotetabelle Deleting Rows From a Remote Table

Beispiele in diesem Abschnitt veranschaulichen, wie zum Löschen von Zeilen aus einer Remotetabelle mithilfe einer Verbindungsserver oder ein Rowsetfunktion auf die Remotetabelle zu verweisen.Examples in this section demonstrate how to delete rows from a remote table by using a linked server or a rowset function to reference the remote table. Eine Remotetabelle ist auf einem anderen Server oder in einer anderen Instanz von SQL Server vorhanden.A remote table exists on a different server or instance of SQL Server.

Gilt für: SQL Server 2008SQL Server 2008 bis SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

F.F. Löschen von Daten aus einer Remotetabelle mithilfe eines VerbindungsserversDeleting data from a remote table by using a linked server

Im folgenden Beispiel werden Zeilen aus einer Remotetabelle gelöscht.The following example deletes rows from a remote table. Im Beispiel wird zuerst erstellen einen Link zur Remotedatenquelle mithilfe Sp_addlinkedserver.The example begins by creating a link to the remote data source by using sp_addlinkedserver. Der Name des Verbindungsservers MyLinkServer, angegeben als Teil des vierteiligen Objektnamens in der Form server.catalog.schema.object.The linked server name, MyLinkServer, is then specified as part of the four-part object name in the form server.catalog.schema.object.

USE master;  
GO  
-- Create a link to the remote data source.   
-- Specify a valid server name for @datasrc as 'server_name' or 'server_name\instance_name'.  

EXEC sp_addlinkedserver @server = N'MyLinkServer',  
    @srvproduct = N' ',  
    @provider = N'SQLNCLI',   
    @datasrc = N'server_name',  
    @catalog = N'AdventureWorks2012';  
GO  
-- Specify the remote data source using a four-part name   
-- in the form linked_server.catalog.schema.object.  

DELETE MyLinkServer.AdventureWorks2012.HumanResources.Department 
WHERE DepartmentID > 16;  
GO  

G.G. Löschen von Daten aus einer Remotetabelle mithilfe der OPENQUERY-FunktionDeleting data from a remote table by using the OPENQUERY function

Das folgende Beispiel löscht Zeilen aus einer Remotetabelle durch Angabe der OPENQUERY Rowset-Funktion.The following example deletes rows from a remote table by specifying the OPENQUERY rowset function. Der im vorherigen Beispiel erstellte Name des Verbindungsservers wird hier verwendet.The linked server name created in the previous example is used in this example.

DELETE OPENQUERY (MyLinkServer, 'SELECT Name, GroupName 
FROM AdventureWorks2012.HumanResources.Department  
WHERE DepartmentID = 18');  
GO  

H.H. Löschen von Daten aus einer Remotetabelle mithilfe der OPENDATASOURCE-FunktionDeleting data from a remote table by using the OPENDATASOURCE function

Das folgende Beispiel löscht Zeilen aus einer Remotetabelle durch Angabe der OPENDATASOURCE Rowset-Funktion.The following example deletes rows from a remote table by specifying the OPENDATASOURCE rowset function. Geben Sie einen gültigen Servernamen für die Datenquelle mithilfe des Formats Server_name oder Server_name\instance_name.Specify a valid server name for the data source by using the format server_name or server_name\instance_name.

DELETE FROM OPENDATASOURCE('SQLNCLI',  
    'Data Source= <server_name>; Integrated Security=SSPI')  
    .AdventureWorks2012.HumanResources.Department   
WHERE DepartmentID = 17;'  

Erfassen der Ergebnisse der DELETE-Anweisung Capturing the results of the DELETE statement

I.I. Verwenden von DELETE mit der OUTPUT-KlauselUsing DELETE with the OUTPUT clause

Das folgende Beispiel zeigt, wie Sie die Ergebnisse Speichern einer DELETE Anweisung in einer Tabellenvariablen in der AdventureWorks2012AdventureWorks2012 Datenbank.The following example shows how to save the results of a DELETE statement to a table variable in the AdventureWorks2012AdventureWorks2012 database.

DELETE Sales.ShoppingCartItem  
OUTPUT DELETED.*   
WHERE ShoppingCartID = 20621;  

--Verify the rows in the table matching the WHERE clause have been deleted.  
SELECT COUNT(*) AS [Rows in Table] 
FROM Sales.ShoppingCartItem 
WHERE ShoppingCartID = 20621;  
GO  

J.J. Verwenden von OUTPUT mit <from_table_name> in einer DELETE-AnweisungUsing OUTPUT with <from_table_name> in a DELETE statement

Das folgende Beispiel löscht Zeilen in der ProductProductPhoto -Tabelle in der AdventureWorks2012AdventureWorks2012 Datenbank basierend auf Suchkriterien, die definiert, der FROM -Klausel der DELETE Anweisung.The following example deletes rows in the ProductProductPhoto table in the AdventureWorks2012AdventureWorks2012 database based on search criteria defined in the FROM clause of the DELETE statement. Die OUTPUT -Klausel gibt die Spalten aus der zu löschenden Tabelle, DELETED.ProductIDund DELETED.ProductPhotoID, sowie Spalten aus der Product -Tabelle zurück.The OUTPUT clause returns columns from the table being deleted, DELETED.ProductID, DELETED.ProductPhotoID, and columns from the Product table. Diese werden in der FROM -Klausel verwendet, um die zu löschenden Zeilen anzugeben.This is used in the FROM clause to specify the rows to delete.

DECLARE @MyTableVar table (  
    ProductID int NOT NULL,   
    ProductName nvarchar(50)NOT NULL,  
    ProductModelID int NOT NULL,   
    PhotoID int NOT NULL);  

DELETE Production.ProductProductPhoto  
OUTPUT DELETED.ProductID,  
       p.Name,  
       p.ProductModelID,  
       DELETED.ProductPhotoID  
    INTO @MyTableVar  
FROM Production.ProductProductPhoto AS ph  
JOIN Production.Product as p   
    ON ph.ProductID = p.ProductID   
    WHERE p.ProductModelID BETWEEN 120 and 130;  

--Display the results of the table variable.  
SELECT ProductID, ProductName, ProductModelID, PhotoID   
FROM @MyTableVar  
ORDER BY ProductModelID;  
GO  

Beispiele: Azure SQL Data WarehouseAzure SQL Data Warehouse und Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

K.K. Löschen Sie alle Zeilen aus einer TabelleDelete all rows from a table

Im folgenden Beispiel werden alle Zeilen aus der Table1-Tabelle gelöscht, da keine WHERE-Klausel verwendet wird, um die Anzahl der gelöschten Zeilen zu begrenzen.The following example deletes all rows from the Table1 table because a WHERE clause is not used to limit the number of rows deleted.

DELETE FROM Table1;  

L.L. Einen Satz von Zeilen aus einer Tabelle löschenDELETE a set of rows from a table

Das folgende Beispiel löscht alle Zeilen aus der Table1 Tabelle einen Wert größer als 1000,00, in denen die StandardCost Spalte.The following example deletes all rows from the Table1 table that have a value greater than 1000.00 in the StandardCost column.

DELETE FROM Table1  
WHERE StandardCost > 1000.00;  

M.M. Verwenden von Bezeichnung mit einer DELETE-AnweisungUsing LABEL with a DELETE statement

Im folgenden Beispiel wird eine Bezeichnung mit der DELETE-Anweisung.The following example uses a label with the DELETE statement.

DELETE FROM Table1  
OPTION ( LABEL = N'label1' );  

N.N. Verwenden eine Bezeichnung und einen Abfragehinweis mit der DELETE-AnweisungUsing a label and a query hint with the DELETE statement

Diese Abfrage zeigt die grundlegende Syntax für die Verwendung eines Join-Abfragehinweis mit der DELETE-Anweisung.This query shows the basic syntax for using a query join hint with the DELETE statement. Weitere Informationen zu joinhinweise und wie Sie die OPTION-Klausel verwenden, finden Sie unter OPTION (SQL Server PDW).For more information on join hints and how to use the OPTION clause, see OPTION (SQL Server PDW).

-- Uses AdventureWorks  

DELETE FROM dbo.FactInternetSales  
WHERE ProductKey IN (   
    SELECT T1.ProductKey FROM dbo.DimProduct T1   
    JOIN dbo.DimProductSubcategory T2  
    ON T1.ProductSubcategoryKey = T2.ProductSubcategoryKey  
    WHERE T2.EnglishProductSubcategoryName = 'Road Bikes' )  
OPTION ( LABEL = N'CustomJoin', HASH JOIN ) ;  

Siehe auchSee Also

CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
TRUNCATE TABLE ( Transact-SQL ) TRUNCATE TABLE (Transact-SQL)
UPDATE (Transact-SQL) UPDATE (Transact-SQL)
WITH Common_table_expression ( Transact-SQL ) WITH common_table_expression (Transact-SQL)
@@ROWCOUNT (Transact-SQL)@@ROWCOUNT (Transact-SQL)