Udostępnij za pomocą


USUŃ (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Magazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Usuwa co najmniej jeden wiersz z tabeli lub widoku w programie SQL Server.

Transact-SQL konwencje składni

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

Arguments

Z <common_table_expression>
Określa tymczasowy nazwany zestaw wyników, znany również jako wspólne wyrażenie tabeli zdefiniowane w zakresie instrukcji DELETE. Zestaw wyników pochodzi z instrukcji SELECT.

Typowe wyrażenia tabeli mogą być również używane z instrukcjami SELECT, INSERT, UPDATE i CREATE VIEW. Aby uzyskać więcej informacji, zobacz WITH common_table_expression (Transact-SQL).

TOP (wyrażenie) [ PERCENT ]
Określa liczbę lub procent losowych wierszy, które zostaną usunięte. wyrażenie może być liczbą lub procentem wierszy. Wiersze, do których odwołuje się wyrażenie TOP używane z instrukcjami INSERT, UPDATE lub DELETE, nie są rozmieszczane w żadnej kolejności. Aby uzyskać więcej informacji, zobacz TOP (Transact-SQL).

FROM
Opcjonalne słowo kluczowe, którego można użyć między słowem kluczowym DELETE a docelowym table_or_view_name lub rowset_function_limited.

table_alias
Alias określony w klauzuli FROM table_source reprezentującej tabelę lub widok, z którego mają zostać usunięte wiersze.

server_name
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.

Nazwa serwera (przy użyciu nazwy serwera połączonego lub funkcji OPENDATASOURCE jako nazwy serwera), w której znajduje się tabela lub widok. Jeśli określono server_name , wymagane są database_name i schema_name .

database_name
Nazwa bazy danych.

schema_name
Nazwa schematu, do którego należy tabela lub widok.

table_or_view_name
Nazwa tabeli lub widoku, z którego mają zostać usunięte wiersze.

Zmienna tabeli w zakresie może być również używana jako źródło tabeli w instrukcji DELETE.

Widok, do którego odwołuje się table_or_view_name , musi być aktualizowalny i odwoływać się do dokładnie jednej tabeli bazowej w klauzuli FROM definicji widoku. Aby uzyskać więcej informacji na temat aktualizowalnych widoków, zobacz CREATE VIEW (Transact-SQL).

rowset_function_limited
Dotyczy: SQL Server 2008 (10.0.x) i nowszych.

Funkcja OPENQUERY lub OPENROWSET podlega możliwościom dostawcy.

Z (<table_hint_limited> [... n] )
Określa co najmniej jedną wskazówkę tabeli dozwoloną dla tabeli docelowej. Słowo kluczowe WITH i nawiasy są wymagane. NOLOCK i READUNCOMMITTED są niedozwolone. Aby uzyskać więcej informacji na temat wskazówek dotyczących tabel, zobacz Wskazówki dotyczące tabel (Transact-SQL).

<OUTPUT_Clause>
Zwraca usunięte wiersze lub wyrażenia na ich podstawie w ramach operacji DELETE. Klauzula OUTPUT nie jest obsługiwana w żadnych instrukcjach DML przeznaczonych dla widoków ani tabel zdalnych. Aby uzyskać więcej informacji na temat argumentów i zachowania tej klauzuli, zobacz OUTPUT Clause (Transact-SQL).

OD table_source
Określa dodatkową klauzulę FROM. To rozszerzenie Transact-SQL delete umożliwia określenie danych z <table_source> i usunięcie odpowiednich wierszy z tabeli w pierwszej klauzuli FROM.

To rozszerzenie, określając sprzężenie, można użyć zamiast podzapytania w klauzuli WHERE, aby zidentyfikować wiersze do usunięcia.

Aby uzyskać więcej informacji, zobacz FROM (Transact-SQL).

WHERE
Określa warunki używane do ograniczenia liczby usuniętych wierszy. Jeśli klauzula WHERE nie jest podana, funkcja DELETE usuwa wszystkie wiersze z tabeli.

Istnieją dwie formy operacji usuwania na podstawie tego, co zostało określone w klauzuli WHERE:

  • Przeszukane usunięcia określają warunek wyszukiwania, aby zakwalifikować wiersze do usunięcia. Na przykład WHERE column_name = wartość.

  • Pozycjonowane usunięcia używają klauzuli CURRENT OF, aby określić kursor. Operacja usuwania występuje w bieżącej pozycji kursora. Może to być dokładniejsze niż przeszukana instrukcja DELETE, która używa klauzuli WHERE search_condition w celu zakwalifikowania wierszy do usunięcia. Przeszukana instrukcja DELETE usuwa wiele wierszy, jeśli warunek wyszukiwania nie identyfikuje unikatowo jednego wiersza.

<search_condition>
Określa warunki ograniczające usuwanie wierszy. Nie ma limitu liczby predykatów, które można uwzględnić w warunku wyszukiwania. Aby uzyskać więcej informacji, zobacz Warunek wyszukiwania (Transact-SQL).

AKTUALNY
Określa, że usuwanie jest wykonywane w bieżącej pozycji określonego kursora.

GLOBAL
Określa, że cursor_name odnosi się do kursora globalnego.

cursor_name
To nazwa otwartego kursora, z którego jest pobierany. Jeśli istnieje zarówno kursor globalny, jak i lokalny o nazwie cursor_name , ten argument odwołuje się do kursora globalnego, jeśli jest określony globalny; w przeciwnym razie odwołuje się do kursora lokalnego. Kursor musi zezwalać na aktualizacje.

cursor_variable_name
Nazwa zmiennej kursora. Zmienna kursora musi odwoływać się do kursora, który zezwala na aktualizacje.

OPCJA (<query_hint> [ ,... n] )
Słowa kluczowe wskazujące, które wskazówki optymalizatora są używane do dostosowywania sposobu przetwarzania instrukcji przez aparat bazy danych. Aby uzyskać więcej informacji, zobacz wskazówki dotyczące zapytań (Transact-SQL).

Najlepsze praktyki

Aby usunąć wszystkie wiersze w tabeli, użyj polecenia TRUNCATE TABLE. TRUNCATE TABLE jest szybszy niż DELETE i używa mniejszej liczby zasobów dziennika systemu i transakcji. TRUNCATE TABLE na przykład tabela nie może uczestniczyć w replikacji. Aby uzyskać więcej informacji, zobacz TRUNCATE TABLE (Transact-SQL)

Użyj funkcji , @@ROWCOUNT aby zwrócić liczbę usuniętych wierszy do aplikacji klienckiej. Aby uzyskać więcej informacji, zobacz @@ROWCOUNT (Transact-SQL).

Obsługa błędów

Obsługę błędów dla instrukcji DELETE można zaimplementować, określając instrukcję TRY...CATCH w konstrukcji.

Instrukcja DELETE może zakończyć się niepowodzeniem, jeśli narusza wyzwalacz lub próbuje usunąć wiersz przywoływane przez dane w innej tabeli z ograniczeniem FOREIGN KEY . DELETE Jeśli usunięcie wielu wierszy i jeden z usuniętych wierszy narusza wyzwalacz lub ograniczenie, instrukcja zostanie anulowana, zwracany jest błąd i nie są usuwane żadne wiersze.

Gdy instrukcja DELETE napotka błąd arytmetyczny (przepełnienie, dzielenie przez zero lub błąd domeny) występujący podczas obliczania wyrażeń, aparat bazy danych obsługuje te błędy tak, jakby SET ARITHABORT był ustawiony na włączone. Pozostała część partii jest anulowana i zwracany jest komunikat o błędzie.

Interoperability

Funkcja DELETE może być używana w treści funkcji zdefiniowanej przez użytkownika, jeśli zmodyfikowany obiekt jest zmienną tabeli.

Usunięcie wiersza zawierającego kolumnę FILESTREAM powoduje również usunięcie jego podstawowych plików systemu plików. Pliki bazowe są usuwane przez moduł odśmiecający element FILESTREAM. Aby uzyskać więcej informacji, zobacz Access FILESTREAM Data with Transact-SQL (Uzyskiwanie dostępu do danych FILESTREAM za pomocą języka Transact-SQL).

Klauzuli FROM nie można określić w instrukcji DELETE, która odwołuje się bezpośrednio lub pośrednio do widoku z wyzwalaczem zdefiniowanym INSTEAD OF na nim. Aby uzyskać więcej informacji o wyzwalaczach zamiast wyzwalaczy, zobacz CREATE TRIGGER (Transact-SQL).

Obecnie nie można określić klauzuli FROM w instrukcji DELETE w magazynie w usłudze Microsoft Fabric.

Ograniczenia i ograniczenia

W przypadku TOP użycia z elementem DELETE, przywoływani wiersze nie są rozmieszczane w żadnej kolejności, a klauzula ORDER BY nie może być bezpośrednio określona w tej instrukcji. Jeśli musisz użyć funkcji TOP, aby usunąć wiersze w znaczącej kolejności chronologicznej, należy użyć TOP razem z klauzulą ORDER BY w instrukcji subselect. Zobacz sekcję Przykłady w tym temacie.

TOP nie można używać w instrukcji DELETE względem widoków partycjonowanych.

Zachowanie blokujące

Domyślnie DELETE instrukcja zawsze uzyskuje wyłączną blokadę intencji (IX) na obiekcie tabeli i strony, które modyfikuje, wyłączną blokadę (X) na zmodyfikowanych wierszach i przechowuje te blokady do momentu zakończenia transakcji.

W przypadku blokady wykluczania intencji (IX) żadna inna transakcja nie może modyfikować tego samego zestawu danych; operacje odczytu mogą odbywać się tylko przy użyciu wskazówki NOLOCK lub odczytu niezatwierdzonego poziomu izolacji. Można określić wskazówki dotyczące tabeli, aby zastąpić to domyślne zachowanie przez czas trwania instrukcji DELETE, określając inną metodę blokowania, jednak zalecamy, aby wskazówki były używane tylko w ostateczności przez doświadczonych deweloperów i administratorów bazy danych. Aby uzyskać więcej informacji, zobacz Wskazówki dotyczące tabel (Transact-SQL).

Gdy wiersze są usuwane ze sterta, aparat bazy danych może używać blokady wiersza lub strony dla operacji. W związku z tym strony wykonane przez operację usuwania pozostają przydzielone do sterta. Jeśli przydział pustych stron nie zostanie cofnięty, skojarzone miejsce nie może być ponownie używane przez inne obiekty w bazie danych.

Aby usunąć wiersze na stosie i cofnąć przydział stron, użyj jednej z następujących metod.

  • TABLOCK Określ wskazówkę w instrukcji DELETE . TABLOCK Użycie wskazówek powoduje, że operacja usuwania powoduje zablokowanie IX obiektu zamiast blokady wiersza lub strony. Dzięki temu można cofnąć przydział stron. Aby uzyskać więcej informacji na temat TABLOCK wskazówki, zobacz Wskazówki dotyczące tabel (Transact-SQL).

  • Użyj TRUNCATE TABLE polecenia , jeśli wszystkie wiersze mają zostać usunięte z tabeli.

  • Utwórz indeks klastrowany na stercie przed usunięciem wierszy. Indeks klastrowany można usunąć po usunięciu wierszy. Ta metoda jest bardziej czasochłonna niż poprzednie metody i używa więcej zasobów tymczasowych.

Note

Puste strony można usuwać z sterty w dowolnym momencie przy użyciu instrukcji ALTER TABLE <table_name> REBUILD .

Jeśli włączono zoptymalizowane blokowanie, niektóre aspekty blokowania zachowania w celu DELETE zmiany. Na przykład blokady wyłącznych (X) nie są przechowywane do momentu zakończenia transakcji. Aby uzyskać więcej informacji, zobacz Zoptymalizowane blokowanie.

Zachowanie logowania

Instrukcja DELETE jest zawsze w pełni rejestrowana.

Zabezpieczenia

Permissions

DELETE uprawnienia są wymagane w tabeli docelowej. SELECT uprawnienia są również wymagane, jeśli instrukcja zawiera klauzulę WHERE.

Uprawnienia DELETE są domyślne dla członków stałej roli serwera, sysadmin ról stałej db_owner bazy danych i db_datawriter stałych ról bazy danych oraz właściciela tabeli. sysadminCzłonkowie ról , db_owneri db_securityadmin oraz właściciel tabeli mogą przenosić uprawnienia do innych użytkowników.

Examples

Category Polecane elementy składni
Podstawowa składnia DELETE
Ograniczanie usuniętych wierszy GDZIE * FROM * kursor *
Usuwanie wierszy z tabeli zdalnej Połączony serwer * funkcja zestawu wierszy OPENQUERY * funkcja zestawu wierszy OPENDATASOURCE
Przechwytywanie wyników instrukcji DELETE Klauzula OUTPUT

Podstawowa składnia

Przykłady w tej sekcji przedstawiają podstawowe funkcje instrukcji DELETE przy użyciu minimalnej wymaganej składni.

A. Używanie klauzuli DELETE bez klauzuli WHERE

Poniższy przykład usuwa wszystkie wiersze z tabeli SalesPersonQuotaHistory w bazie danych AdventureWorks2025, ponieważ klauzula WHERE nie jest używana do ograniczenia liczby usuniętych wierszy.

DELETE FROM Sales.SalesPersonQuotaHistory;  
GO  

Ograniczanie usuniętych wierszy

Przykłady w tej sekcji pokazują, jak ograniczyć liczbę wierszy, które zostaną usunięte.

B. Używanie klauzuli WHERE do usuwania zestawu wierszy

Poniższy przykład usuwa wszystkie wiersze z tabeli ProductCostHistory w bazie danych AdventureWorks2025, w których wartość w kolumnie StandardCost jest większa niż 1000.00.

DELETE FROM Production.ProductCostHistory  
WHERE StandardCost > 1000.00;  
GO  

W poniższym przykładzie przedstawiono bardziej złożoną klauzulę WHERE. Klauzula WHERE definiuje dwa warunki, które należy spełnić, aby określić wiersze do usunięcia. Wartość w kolumnie StandardCost musi zawierać się między 12.00 i 14.00 a wartość w kolumnie SellEndDate musi mieć wartość null. Przykład wyświetla również wartość z funkcji @@ROWCOUNT , aby zwrócić liczbę usuniętych wierszy.

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. Używanie kursora do określenia wiersza do usunięcia

Poniższy przykład usuwa pojedynczy wiersz z tabeli EmployeePayHistory w bazie danych AdventureWorks2025 za pomocą kursora o nazwie complex_cursor. Operacja usuwania wpływa tylko na pojedynczy wiersz aktualnie pobierany z kursora.

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. Używanie sprzężeń i podzapytania do danych w jednej tabeli w celu usunięcia wierszy w innej tabeli

W poniższych przykładach pokazano dwa sposoby usuwania wierszy w jednej tabeli na podstawie danych w innej tabeli. W obu przypadkach wiersze z tabeli SalesPersonQuotaHistory w bazie AdventureWorks2025 są usuwane na podstawie sprzedaży od początku roku zapisanej w tabeli SalesPerson . DELETE Pierwsza instrukcja przedstawia rozwiązanie podzapytania zgodne z normą ISO, a druga DELETE instrukcja pokazuje rozszerzenie Transact-SQL FROM, aby połączyć dwie tabele.

-- 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. Używanie funkcji TOP w celu ograniczenia liczby usuniętych wierszy

Gdy klauzula TOP (n) jest używana z funkcją DELETE, operacja usuwania jest wykonywana na losowym wyborze n wierszy. Poniższy przykład usuwa 20 losowe wiersze z tabeli PurchaseOrderDetail w bazie AdventureWorks2025, które mają terminy wcześniejsze niż 1 lipca 2006 roku.

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

Jeśli musisz użyć funkcji TOP, aby usunąć wiersze w znaczącej kolejności chronologicznej, musisz użyć funkcji TOP wraz z instrukcją ORDER BY w instrukcji subselect. Poniższe zapytanie usuwa 10 wierszy tabeli PurchaseOrderDetail, które mają najwcześniejsze daty ukończenia. Aby upewnić się, że usunięto tylko 10 wierszy, kolumna określona w instrukcji subselect (PurchaseOrderID) jest kluczem podstawowym tabeli. Użycie kolumny innej niż klucz w instrukcji subselect może spowodować usunięcie więcej niż 10 wierszy, jeśli określona kolumna zawiera zduplikowane wartości.

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

Usuwanie wierszy z tabeli zdalnej

Przykłady w tej sekcji pokazują, jak usunąć wiersze z tabeli zdalnej przy użyciu serwera połączonego lub funkcji zestawu wierszy w celu odwołania się do tabeli zdalnej. Tabela zdalna istnieje na innym serwerze lub wystąpieniu programu SQL Server.

Dotyczy: SQL Server 2008 (10.0.x) i nowszych.

F. Usuwanie danych z tabeli zdalnej przy użyciu serwera połączonego

Poniższy przykład usuwa wiersze z tabeli zdalnej. Przykład rozpoczyna się od utworzenia linku do zdalnego źródła danych przy użyciu sp_addlinkedserver. Nazwa serwera MyLinkServerpołączonego , jest następnie określona jako część nazwy obiektu czteroczęściowego w obiekcie formularza 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'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. Usuwanie danych z tabeli zdalnej przy użyciu funkcji OPENQUERY

Poniższy przykład usuwa wiersze z tabeli zdalnej, określając funkcję zestawu wierszy OPENQUERY . W tym przykładzie użyto nazwy serwera połączonego utworzonego w poprzednim przykładzie.

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

H. Usuwanie danych z tabeli zdalnej przy użyciu funkcji OPENDATASOURCE

Poniższy przykład usuwa wiersze z tabeli zdalnej, określając funkcję zestawu wierszy OPENDATASOURCE . Określ prawidłową nazwę serwera dla źródła danych przy użyciu formatu server_name lub server_name\instance_name.

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

Przechwytywanie wyników instrukcji DELETE

I. Używanie funkcji DELETE z klauzulą OUTPUT

Poniższy przykład pokazuje, jak zapisać wyniki zawołania DELETE do zmiennej tabelowej w bazie AdventureWorks2025.

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. Używanie funkcji OUTPUT z <from_table_name> w instrukcji DELETE

Poniższy przykład usuwa wiersze w tabeli ProductProductPhoto bazy AdventureWorks2025 na podstawie kryteriów wyszukiwania określonych w klauzuli FROM oświadczenia DELETE . Klauzula OUTPUT zwraca kolumny z tabeli, która jest usuwana, DELETED.ProductID, DELETED.ProductPhotoIDi z Product tabeli. Jest on używany w klauzuli FROM , aby określić wiersze do usunięcia.

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  

Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)

K. Usuwanie wszystkich wierszy z tabeli

Poniższy przykład usuwa wszystkie wiersze z tabeli, Table1 ponieważ klauzula WHERE nie jest używana do ograniczenia liczby usuniętych wierszy.

DELETE FROM Table1;  

L. USUWANIE zestawu wierszy z tabeli

Poniższy przykład usuwa wszystkie wiersze z Table1 tabeli, które mają wartość większą niż 1000,00 w kolumnie StandardCost .

DELETE FROM Table1  
WHERE StandardCost > 1000.00;  

M. Używanie instrukcji LABEL z instrukcją DELETE

W poniższym przykładzie użyto etykiety z instrukcją DELETE.

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

N. Używanie etykiety i wskazówki zapytania z instrukcją DELETE

To zapytanie przedstawia podstawową składnię użycia wskazówki sprzężenia zapytania z instrukcją DELETE. Aby uzyskać więcej informacji na temat wskazówek sprzężenia i sposobu używania klauzuli OPTION, zobacz 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 ) ;  

O. Usuwanie przy użyciu klauzuli WHERE

To zapytanie pokazuje, jak usunąć przy użyciu klauzuli WHERE i nie używać klauzuli FROM.

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

P. Usuń na podstawie wyniku połączenia z inną tabelą

W tym przykładzie pokazano, jak usunąć z tabeli na podstawie wyniku łączenia z inną tabelą.

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;  

Zobacz też

UTWÓRZ TRIGGER (Transact-SQL)
WSTAW (Transact-SQL)
WYBIERZ (Transact-SQL)
STÓŁ OBCIĘĆ (Transact-SQL)
AKTUALIZACJA (Transact-SQL)
Z common_table_expression (Transact-SQL)
@@ROWCOUNT (Transact-SQL)