Freigeben über


DELETE (Transact-SQL)

Gilt für: SQL Server Azure SQL-Datenbank Azure SQL verwaltete Instanz Azure Synapse Analytics Platform System (PDW) Warehouse in Microsoft Fabric

Entfernt mindestens eine Zeile aus einer Tabelle oder Sicht in SQL Server.

Transact-SQL-Syntaxkonventionen

Syntax

-- 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 Synapse Analytics and Microsoft Fabric

[ WITH <common_table_expression> [ ,...n ] ] 
DELETE [database_name . [ schema ] . | schema. ] table_name  
FROM [database_name . [ schema ] . | schema. ] table_name 
JOIN {<join_table_source>}[ ,...n ]  
ON <join_condition>
[ WHERE <search_condition> ]   
[ OPTION ( <query_options> [ ,...n ]  ) ]  
[; ]  

<join_table_source> ::=   
{  
    [ database_name . [ schema_name ] . | schema_name . ] table_or_view_name [ AS ] table_or_view_alias 
    [ <tablesample_clause>]  
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]  
}  
-- Syntax for Parallel Data Warehouse  
  
DELETE 
    [ FROM [database_name . [ schema ] . | schema. ] table_name ]   
    [ WHERE <search_condition> ]   
    [ OPTION ( <query_options> [ ,...n ]  ) ]  
[; ]  

Argumente

WITH <common_table_expression>
Gibt das temporäre benannte Resultset, auch als allgemeiner Tabellenausdruck bezeichnet, an, das im Rahmen der DELETE-Anweisung definiert wurde. Das Resultset wird von einer SELECT-Anweisung abgeleitet.

Allgemeine Tabellenausdrücke können außerdem mit SELECT-, INSERT-, UPDATE- und CREATE VIEW-Anweisungen verwendet werden. Weitere Informationen finden Sie unter WITH common_table_expression (Transact-SQL).

TOP (expression) [ PERCENT ]
Gibt die Anzahl oder den Prozentsatz willkürlicher Zeilen an, die gelöscht werden. expression kann eine Anzahl oder ein Prozentsatz der Zeilen sein. Die Zeilen, auf die im TOP-Ausdruck für die Anweisung INSERT, UPDATE oder DELETE verwiesen wird, sind nicht auf bestimmte Weise angeordnet. Weitere Informationen finden Sie unter TOP (Transact-SQL).

FROM
Ein optionales Schlüsselwort, das zwischen dem DELETE-Schlüsselwort und den Zielen table_or_view_name oder rowset_function_limited verwendet werden kann.

table_alias
Der in der FROM-table_source-Klausel angegebene Alias, der die Tabelle oder Sicht darstellt, aus der die Zeilen gelöscht werden sollen.

server_name
Gilt für: SQL Server 2008 (10.0.x) und später

Der Name des Servers (der einen Verbindungsservernamen oder die Funktion OPENDATASOURCE als Servernamen verwendet), auf dem sich die Tabelle oder die Sicht befindet. Wenn server_name angegeben ist, sind database_name und schema_name erforderlich.

database_name
Der Name der Datenbank.

schema_name
Der Name des Schemas, zu dem die Tabelle oder Sicht gehören.

table_or_view_name
Der Name der Tabelle oder Sicht, aus der die Zeilen entfernt werden sollen.

In ihrem Gültigkeitsbereich kann eine Tabellenvariable auch als Quelltabelle in einer DELETE-Anweisung verwendet werden.

Die Sicht, auf die table_or_view_name verweist, muss aktualisierbar sein und auf genau eine Basistabelle in der FROM-Klausel der Sichtdefinition verweisen. Weitere Informationen zu aktualisierbaren Sichten finden Sie unter CREATE VIEW (Transact-SQL).

rowset_function_limited
Gilt für: SQL Server 2008 (10.0.x) und später

Entweder die Funktion OPENQUERY oder OPENROWSET, abhängig von den Funktionen des Anbieters.

WITH (<table_hint_limited> [... n] )
Gibt mindestens einen Tabellenhinweis an, der für eine Zieltabelle zulässig ist. Das WITH-Schlüsselwort und die Klammern sind erforderlich. NOLOCK und READUNCOMMITTED sind nicht zulässig. Weitere Informationen zu Tabellenhinweisen finden Sie unter Tabellenhinweise (Transact-SQL).

<OUTPUT_Clause>
Gibt gelöschte Zeilen bzw. auf diesen basierende Ausdrücke als Teil der DELETE-Operation zurück. Die OUTPUT-Klausel wird in DML-Anweisungen, deren Ziel Sichten oder Remotetabellen sind, nicht unterstützt. Weitere Informationen zu den Argumenten und dem Verhalten dieser Klausel finden Sie unter OUTPUT-Klausel (Transact-SQL).

FROM table_source
Gibt eine zusätzliche FROM-Klausel an. Diese Transact-SQL-Erweiterung für DELETE ermöglicht Ihnen, Daten aus <table_source> anzugeben und die entsprechenden Zeilen aus der Tabelle in der ersten FROM-Klausel zu löschen.

Diese Erweiterung, die einen Join angibt, kann anstelle einer Unterabfrage in der WHERE-Klausel verwendet werden, um zu entfernende Zeilen zu identifizieren.

Weitere Informationen finden Sie unter FROM (Transact-SQL).

WHERE
Gibt die Bedingungen an, die zur Beschränkung der Anzahl der gelöschten Zeilen verwendet werden. Wird keine WHERE-Klausel angegeben, werden mit DELETE alle Zeilen aus der Tabelle entfernt.

Es gibt zwei Formen von Löschoperationen, die darauf basieren, was in der WHERE-Klausel angegeben wird:

  • Gesuchte Löschungen geben eine Suchbedingung an, um die zu löschenden Zeilen zu kennzeichnen. Zum Beispiel WHERE column_name = value.

  • Positionierte Löschungen verwenden die CURRENT OF-Klausel, um einen Cursor anzugeben. Die Löschoperation wird an der aktuellen Position des Cursors ausgeführt. Dies kann genauer sein als eine gesuchte DELETE-Anweisung, die eine WHERE search_condition-Klausel zur Qualifizierung der zu löschenden Zeilen verwendet. Eine gesuchte DELETE-Anweisung löscht mehrere Zeilen, wenn die Suchbedingung nicht eindeutig eine einzelne Zeile identifiziert.

<search_condition>
Gibt die Einschränkungsbedingungen für die zu löschenden Zeilen an. Es gibt keinen Höchstwert hinsichtlich der Anzahl von Prädikaten in einer Suchbedingung. Weitere Informationen finden Sie unter Suchbedingung (Transact-SQL).

CURRENT OF
Gibt an, dass DELETE an der aktuellen Position des angegebenen Cursors durchgeführt wird.

GLOBAL
Gibt an, dass cursor_name auf einen globalen Cursor verweist.

cursor_name
Der Name des geöffneten Cursors, von dem der Abruf erfolgt. 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. Der Cursor muss Updates zulassen.

cursor_variable_name
Der Name einer Cursorvariablen. Die Cursorvariable muss auf einen Cursor verweisen, der Updates zulässt.

OPTION (<query_hint> [ ,... n] )
Schlüsselwörter, die angeben, dass Hinweise für den Optimierer verwendet werden, um die Verarbeitung der Anweisung durch die Datenbank-Engine anzupassen. Weitere Informationen finden Sie unter Abfragehinweise (Transact-SQL).

Bewährte Methoden

Um alle Zeilen in einer Tabelle zu löschen, verwenden Sie TRUNCATE TABLE. TRUNCATE TABLE ist schneller als DELETE und verwendet weniger System- und Transaktionsprotokollressourcen. Für TRUNCATE TABLE gelten Einschränkungen, beispielsweise kann die Tabelle nicht in Replikationen verwendet werden. Weitere Informationen finden Sie unter TRUNCATE TABLE (Transact-SQL).

Verwenden Sie die @@ROWCOUNT-Funktion, um die Anzahl der gelöschten Zeilen an die Clientanwendung zurückzugeben. Weitere Informationen finden Sie unter @@@ROWCOUNT (Transact-SQL).

Fehlerbehandlung

Sie können die Fehlerbehandlung für die DELETE-Anweisung durch Angeben der Anweisung in einem TRY...CATCH-Konstrukt implementieren.

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. 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 es werden keine Zeilen entfernt.

Wenn in einer DELETE-Anweisung bei der Auswertung eines Ausdrucks ein arithmetischer Fehler (Überlauf, Division durch null oder Domänenfehler) auftritt, behandelt Datenbank-Engine den Fehler so, als wäre SET ARITHABORT auf ON festgelegt. Der Rest des Batches wird abgebrochen, und eine Fehlermeldung wird zurückgegeben.

Interoperabilität

DELETE kann im Textkörper einer benutzerdefinierten Funktion verwendet werden, wenn es sich bei dem geänderten Objekt um eine Tabellenvariable handelt.

Wenn Sie eine Zeile mit einer FILESTREAM-Spalte löschen, löschen Sie auch die zugrunde liegenden Dateisystemdateien. Die zugrunde liegenden Dateien werden vom FILESTREAM Garbage Collector entfernt. Weitere Informationen finden Sie unter Zugreifen auf FILESTREAM-Daten mit Transact-SQL.

Die FROM-Klausel kann nicht in einer DELETE-Anweisung angegeben werden, die (direkt oder indirekt) auf eine Sicht verweist, für die ein INSTEAD OF-Trigger definiert wurde. Weitere Informationen zu INSTEAD OF-Triggern finden Sie unter CREATE TRIGGER (Transact-SQL).

Derzeit kann die FROM-Klausel in einer DELETE-Anweisung in Warehouse in Microsoft Fabric nicht angegeben werden.

Einschränkungen

Wenn TOP mit DELETE 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. Wenn Sie die TOP-Klausel verwenden müssen, um Zeilen in einer sinnvollen Reihenfolge zu löschen, müssen Sie sie TOP zusammen mit einer ORDER BY-Klausel in einer untergeordneten SELECT-Anweisung verwenden. Weitere Informationen finden Sie im Abschnitt "Beispiele" in diesem Thema.

TOP kann nicht in einer DELETE-Anweisung mit partitionierten Sichten verwendet werden.

Sperrverhalten

Standardmäßig ruft eine DELETE-Anweisung immer eine beabsichtigte exklusive Sperre (IX) für das Tabellenobjekt und die Seiten ab, die sie ändert, und eine exklusive Sperre (X) für die von ihr geänderten Zeilen, und hält diese Sperre bis zum Abschluss der Transaktion aufrecht.

Eine beabsichtigte exklusive Sperre (IX) bewirkt, dass derselbe Datensatz mit keiner anderen Transaktion geändert werden kann. Lesevorgänge können nur mithilfe des NOLOCK-Hinweises oder der READ UNCOMMITTED-Isolationsstufe ausgeführt werden. 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. Weitere Informationen finden Sie unter Tabellenhinweise (Transact-SQL).

Wenn Zeilen aus einem Heap gelöscht werden, können von Datenbank-Engine Zeilen- oder Seitensperren für den Vorgang verwendet werden. Demzufolge bleiben die durch den Löschvorgang geleerten Seiten dem Heap zugeordnet. Wenn die Zuordnung leerer Seiten nicht aufgehoben wird, kann der zugehörige Speicherplatz nicht für andere Objekte in der Datenbank verwendet werden.

Verwenden Sie eine der folgenden Methoden, um Zeilen in einem Heap zu löschen und die Zuordnung der Seiten aufzuheben:

  • Geben Sie den TABLOCK-Hinweis in der DELETE-Anweisung an. Mithilfe des TABLOCK-Hinweises wird durch den Löschvorgang eine IX-Sperre statt einer Zeilen- oder Seitensperre für das Objekt angefordert. Dadurch ist es möglich, die Zuordnung der Seiten aufzuheben. Weitere Informationen zu dem TABLOCK-Hinweis finden Sie unter Tabellenhinweise (Transact-SQL).

  • Verwenden Sie TRUNCATE TABLE, wenn alle Zeilen aus der Tabelle gelöscht werden sollen.

  • Erstellen Sie einen gruppierten Index für den Heap, bevor Sie die Zeilen löschen. Nach dem Löschen der Zeilen können Sie den gruppierten Index löschen. Diese Methode ist zeitaufwändiger als die vorherigen Methoden und beansprucht mehr temporäre Ressourcen.

Hinweis

Leere Seiten können zu jeder Zeit mithilfe der Anweisung ALTER TABLE <table_name> REBUILD aus einem Heap gelöscht werden.

Protokollierungsverhalten

Die DELETE-Anweisung wird immer vollständig protokolliert.

Sicherheit

Berechtigungen

Für die Zieltabelle sind DELETE-Berechtigungen erforderlich. SELECT-Berechtigungen werden ebenfalls benötigt, wenn die Anweisung eine WHERE-Klausel enthält.

DELETE-Berechtigungen werden standardmäßig Mitgliedern der festen Serverrolle sysadmin und der festen Datenbankrollen db_owner und db_datawriter sowie Tabellenbesitzern erteilt. Mitglieder der Rollen sysadmin, db_owner und db_securityadmin sowie der Tabellenbesitzer können Berechtigungen an andere Benutzer übertragen.

Beispiele

Category Funktionssyntaxelemente
Grundlegende Syntax Delete
Beschränken von zu löschenden Zeilen WHERE * FROM * Cursor *
Löschen von Zeilen aus einer Remotetabelle Verbindungsserver * OPENQUERY-Rowsetfunktion * OPENDATASOURCE-Rowsetfunktion
Erfassen der Ergebnisse der DELETE-Anweisung OUTPUT-Klausel

Allgemeine Syntax

Anhand von Beispielen in diesem Abschnitt wird die grundlegende Funktion der DELETE-Anweisung mithilfe der mindestens erforderlichen Syntax veranschaulicht.

A. Verwenden von DELETE ohne WHERE-Klausel

Im folgenden Beispiel werden alle Zeilen aus der Tabelle SalesPersonQuotaHistory in der AdventureWorks2022-Datenbank gelöscht, da keine WHERE-Klausel verwendet wird, um die Anzahl der gelöschten Zeilen zu begrenzen.

DELETE FROM Sales.SalesPersonQuotaHistory;  
GO  

Beschränken von zu löschenden Zeilen

In den Beispielen in diesem Abschnitt wird veranschaulicht, wie die Anzahl von Zeilen beschränkt wird, die gelöscht werden.

B. Löschen einer Reihe von Zeilen mithilfe der WHERE-Klausel

Im folgenden Beispiel werden alle Zeilen der Tabelle ProductCostHistory aus der AdventureWorks2022-Datenbank gelöscht, bei denen der Wert in der Spalte StandardCost über 1000.00 liegt.

DELETE FROM Production.ProductCostHistory  
WHERE StandardCost > 1000.00;  
GO  

Im folgenden Beispiel wird eine komplexere WHERE-Klausel veranschaulicht. Die WHERE-Klausel definiert zwei Bedingungen, die erfüllt werden müssen, um die zu löschenden Zeilen zu bestimmen. Der Wert in der StandardCost -Spalte muss zwischen 12.00 und 14.00 liegen, und der Wert in der SellEndDate -Spalte muss NULL sein. Im Beispiel wird auch der Wert der @@ROWCOUNT -Funktion ausgegeben, um die Anzahl der gelöschten Zeilen zurückzugeben.

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. Bestimmen der zu löschenden Zeile mithilfe eines Cursors

Im folgenden Beispiel wird eine einzelne Zeile aus der Tabelle EmployeePayHistory in der AdventureWorks2022-Datenbank mithilfe eines Cursors namens complex_cursor gelöscht. Von der Löschoperation ist nur die Zeile betroffen, die aktuell durch den Cursor abgerufen wird.

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: Verwenden von Joins und Unterabfragen für Daten in einer Tabelle, um Zeilen in einer anderen Tabelle zu löschen

In den folgenden Beispielen werden zwei Möglichkeiten veranschaulicht, Zeilen in einer Tabelle anhand von Daten in einer anderen Tabelle zu löschen. In beiden Beispielen werden Zeilen aus der Tabelle SalesPersonQuotaHistory in der AdventureWorks2022-Datenbank anhand der Verkaufszahlen des laufenden Jahres gelöscht, die in der Tabelle SalesPerson gespeichert sind. Die erste DELETE-Anweisung zeigt die Lösung mit einer ISO-kompatiblen Unterabfrage, die zweite DELETE-Anweisung zeigt die FROM-Erweiterung Transact-SQL zum Verknüpfen der beiden Tabellen an.

-- 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. Verwenden von TOP, um die Anzahl der zu löschenden Zeilen einzuschränken

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. Im folgenden Beispiel werden 20 zufällige Zeilen aus der Tabelle PurchaseOrderDetail in der AdventureWorks2022-Datenbank gelöscht, die ein Fälligkeitsdatum vor dem 1. Juli 2006 aufweisen.

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. Die folgende Abfrage löscht die zehn Zeilen der PurchaseOrderDetail -Tabelle mit den frühesten Fälligkeitsdaten. 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. 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.

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

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. Eine Remotetabelle ist auf einem anderen Server oder in einer anderen Instanz von SQL Server vorhanden.

Gilt für: SQL Server 2008 (10.0.x) und später

F. Löschen von Daten aus einer Remotetabelle mithilfe eines Verbindungsservers

Im folgenden Beispiel werden Zeilen aus einer Remotetabelle gelöscht. In diesem Beispiel wird zunächst mithilfe von sp_addlinkedserver ein Link zur Remotedatenquelle erstellt. Der Name des Verbindungsservers (MyLinkServer) wird anschließend als Teil des vierteiligen Objektnamens in der Form server.catalog.schema.object angegeben.

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'AdventureWorks2022';  
GO  
-- Specify the remote data source using a four-part name   
-- in the form linked_server.catalog.schema.object.  
  
DELETE MyLinkServer.AdventureWorks2022.HumanResources.Department 
WHERE DepartmentID > 16;  
GO  

G. Löschen von Daten aus einer Remotetabelle mithilfe der OPENQUERY-Funktion

Im folgenden Beispiel werden durch Angabe der Rowsetfunktion OPENQUERY Zeilen aus einer Remotetabelle gelöscht. Der im vorherigen Beispiel erstellte Name des Verbindungsservers wird hier verwendet.

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

H. Löschen von Daten aus einer Remotetabelle mithilfe der OPENDATASOURCE-Funktion

Im folgenden Beispiel werden durch Angabe der Rowsetfunktion OPENDATASOURCE Zeilen aus einer Remotetabelle gelöscht. Geben Sie im Format server_name oder server_name\instance_name einen gültigen Servernamen für die Datenquelle an.

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

Erfassen der Ergebnisse der DELETE-Anweisung

I. Verwenden von DELETE mit der OUTPUT-Klausel

Im folgenden Beispiel wird gezeigt, wie die Ergebnisse einer DELETE-Anweisung in einer Tabellenvariablen in der AdventureWorks2022-Datenbank gespeichert werden.

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. Verwenden von OUTPUT mit <from_table_name> in einer DELETE-Anweisung

Im folgenden Beispiel werden Zeilen in der Tabelle ProductProductPhoto basierend auf Suchkriterien, die in der FROM-Klausel der DELETE-Anweisung definiert wurden, aus der AdventureWorks2022-Datenbank gelöscht. Die OUTPUT -Klausel gibt die Spalten aus der zu löschenden Tabelle, DELETED.ProductIDund DELETED.ProductPhotoID, sowie Spalten aus der Product -Tabelle zurück. Diese werden in der FROM -Klausel verwendet, um die zu löschenden Zeilen anzugeben.

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 Synapse Analytics und Analytics-Plattformsystem (PDW)

K. Löschen aller Zeilen einer Tabelle

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.

DELETE FROM Table1;  

L. Löschen einer Reihe von Zeilen einer Tabelle mit DELETE

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,00 ist.

DELETE FROM Table1  
WHERE StandardCost > 1000.00;  

M. Verwenden von LABEL mit einer DELETE-Anweisung

Im folgenden Beispiel wird eine Bezeichnung mit der Anweisung DELETE verwendet.

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

N. Verwenden einer Bezeichnung und eines Abfragehinweises mit der Anweisung DELETE

Diese Abfrage zeigt die grundlegende Syntax für die Verwendung eines Join-Abfragehinweises mit der DELETE-Anweisung. Weitere Informationen zu Join-Abfragehinweisen und zur Verwendung der OPTION-Klausel finden Sie unter OPTION-Klausel (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 ) ;  

O. Löschen mithilfe einer WHERE-Klausel

Diese Abfrage zeigt, wie Sie mithilfe einer WHERE-Klausel und ohne eine FROM-Klausel löschen.

DELETE tableA WHERE EXISTS (
SELECT TOP 1 1 FROM tableB tb WHERE tb.col1 = tableA.col1
)

P. Die Löschung basiert auf dem Ergebnis der Verknüpfung mit einer anderen Tabelle.

Dieses Beispiel zeigt, wie aus einer Tabelle gelöscht wird, basierend auf dem Ergebnis der Verknüpfung mit einer anderen Tabelle.

CREATE TABLE dbo.Table1   
    (ColA int NOT NULL, ColB decimal(10,3) NOT NULL);  
GO  

CREATE TABLE dbo.Table2   
    (ColA int PRIMARY KEY NOT NULL, ColB decimal(10,3) NOT NULL);  
GO  
INSERT INTO dbo.Table1 VALUES(1, 10.0), (1, 20.0);  
INSERT INTO dbo.Table2 VALUES(1, 0.0);  
GO  

DELETE dbo.Table2   
FROM dbo.Table2   
    INNER JOIN dbo.Table1   
    ON (dbo.Table2.ColA = dbo.Table1.ColA)
    WHERE dbo.Table2.ColA = 1;  

Weitere Informationen

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