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

GILT FÜR: jaSQL Server jaAzure SQL-DatenbankjaAzure SQL Data Warehouse jaParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Entfernt mindestens eine Zeile 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-SyntaxkonventionenTopic 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

WITH <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 ( expression ) [ 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 TOP (Transact-SQL).For more information, see TOP (Transact-SQL).

FROMFROM
Ein optionales Schlüsselwort, das zwischen dem DELETE-Schlüsselwort und den Zielen table_or_view_name oder rowset_function_limited verwendet werden kann.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
Der in der FROM-table_source-Klausel angegebene Alias, der die Tabelle oder Sicht darstellt, aus der die Zeilen gelöscht werden sollen.The alias specified in the FROM table_source clause representing the table or view from which the rows are to be deleted.

server_nameserver_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 (der einen Verbindungsservernamen oder die Funktion OPENDATASOURCE als Servernamen verwendet), auf dem sich die Tabelle oder die 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 ist, sind database_name und schema_name erforderlich.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, auf die table_or_view_name verweist, 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 Funktion OPENQUERY oder OPENROWSET, abhängig von den Funktionen des Anbieters.Either the OPENQUERY or OPENROWSET function, subject to provider capabilities.

WITH ( <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).

FROM table_sourceFROM table_source
Gibt eine zusätzliche FROM-Klausel an.Specifies an additional FROM clause. Diese Transact-SQLTransact-SQL-Erweiterung für DELETE ermöglicht es Ihnen, Daten aus <table_source> anzugeben und die entsprechenden Zeilen aus der Tabelle in der ersten FROM-Klausel zu löschen.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 WHERE column_name = value.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 search_condition-Klausel zur Qualifizierung der zu löschenden Zeilen verwendet.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.

cursor_namecursor_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 namens cursor_name vorhanden sind, bezieht sich dieses Argument auf den globalen Cursor, wenn GLOBAL angegeben ist. Andernfalls bezieht es 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, dass Hinweise für den Optimierer verwendet werden, um die Verarbeitung der Anweisung durch Datenbank-EngineDatabase Engine anzupassen.Keywords that indicate which optimizer hints are used to customize the way the Datenbank-EngineDatabase 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 Sie die @@ROWCOUNT-Funktion, um die Anzahl der gelöschten Zeilen an die Clientanwendung zurückzugeben.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 Datenbank-EngineDatabase 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 Datenbank-EngineDatabase 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-Triggern 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 Datenbank-EngineDatabase Engine Zeilen- oder Seitensperren für den Vorgang verwendet werden.When rows are deleted from a heap the Datenbank-EngineDatabase 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 zu dem 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 zu jeder Zeit mithilfe der Anweisung ALTER TABLE <table_name> REBUILD aus einem Heap gelöscht werden.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.

SecuritySecurity

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.

Mitglieder der festen Serverrolle sysadmin, der festen Datenbankrollen db_owner und db_datawriter und der Tabellenbesitzer erhalten standardmäßig DELETE-Berechtigungen.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 Rollen sysadmin, db_owner und db_securityadmin 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
Beschränken von zu löschenden ZeilenLimiting 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 SyntaxBasic 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  

Beschränken von zu löschenden ZeilenLimiting 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

Im folgenden Beispiel werden alle Zeilen der ProductCostHistory -Tabelle in der AdventureWorks2012AdventureWorks2012 -Datenbank gelöscht, bei denen der Wert in der StandardCost -Spalte 1000.00überschreitet.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. Im Beispiel wird auch der Wert der **@@ROWCOUNT** -Funktion ausgegeben, um die Anzahl der gelöschten Zeilen zurückzugeben.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

Im folgenden Beispiel wird eine einzelne Zeile der EmployeePayHistory -Tabelle in der AdventureWorks2012AdventureWorks2012 -Datenbank gelöscht, bei der ein Cursor mit dem Namen my_cursor.The following example deletes a single row from the EmployeePayHistory table in the AdventureWorks2012AdventureWorks2012 database using a cursor named my_cursor. 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 Tabelle SalesPersonQuotaHistory aus der Datenbank AdventureWorks2012AdventureWorks2012 anhand der Verkaufszahlen des laufenden Jahres gelöscht, die in der Tabelle SalesPerson gespeichert sind.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 Anweisung DELETE zeigt die Lösung mit einer ISO-kompatiblen Unterabfrage, die zweite Anweisung DELETE zeigt die FROM-Erweiterung Transact-SQLTransact-SQL zum Verknüpfen der beiden Tabellen an.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 zusammen mit DELETE verwendet wird, wird der Löschvorgang für eine zufällige Auswahl von n Zeilen ausgeführt.When a TOP (n) clause is used with DELETE, the delete operation is performed on a random selection of n number of rows. Im folgenden Beispiel werden 20 zufällige Zeilen aus der Tabelle PurchaseOrderDetail in der Datenbank AdventureWorks2012AdventureWorks2012 gelöscht, die ein Fälligkeitsdatum vor dem 1. Juli 2006 aufweisen.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 RemotetabelleDeleting Rows From a Remote Table

In den Beispielen in diesem Abschnitt wird veranschaulicht, wie Zeilen mit einem Verbindungsserver oder einer Rowsetfunktion aus einer Remotezieltabelle gelöscht werden, um 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. In diesem Beispiel wird zunächst mithilfe von sp_addlinkedserver ein Link zur Remotedatenquelle erstellt.The example begins by creating a link to the remote data source by using sp_addlinkedserver. Der Name des Verbindungsservers (MyLinkServer) wird anschließend als Teil des vierteiligen Objektnamens in der Form server.catalog.schema.object angegeben.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

Im folgenden Beispiel werden durch Angabe der OPENQUERY -Rowsetfunktion Zeilen aus einer Remotetabelle gelöscht.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

Im folgenden Beispiel werden durch Angabe der Rowsetfunktion OPENDATASOURCE Zeilen aus einer Remotetabelle gelöscht.The following example deletes rows from a remote table by specifying the OPENDATASOURCE rowset function. Geben Sie im Format server_name oder server_name\instance_name einen gültigen Servernamen für die Datenquelle an.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-AnweisungCapturing the results of the DELETE statement

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

Im folgenden Beispiel wird gezeigt, wie die Ergebnisse einer DELETE-Anweisung in einer Tabellenvariablen in der Datenbank AdventureWorks2012AdventureWorks2012 gespeichert werden.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

Im folgenden Beispiel werden Zeilen in der Tabelle ProductProductPhoto aus der Datenbank AdventureWorks2012AdventureWorks2012 basierend auf Suchkriterien gelöscht, die in der Klausel FROM der Anweisung DELETE definiert wurden.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 Warehouse.Examples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

K.K. Löschen aller Zeilen 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. Löschen einer Reihe von Zeilen einer Tabelle mit DELETEDELETE a set of rows from a table

Im folgenden Beispiel werden alle Zeilen aus der Tabelle Table1 gelöscht, die in der Spalte StandardCost einen Wert enthalten, der höher als 1000 ist.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 LABEL mit einer DELETE-AnweisungUsing LABEL with a DELETE statement

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

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

N.N. Verwenden einer Bezeichnung und eines Abfragehinweises mit der Anweisung DELETEUsing a label and a query hint with the DELETE statement

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

-- 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 ) ;  

Weitere InformationenSee 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)