DELETE (Transact-SQL)

Usuwa wiersze z tabela lub widoku.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

[ WITH <common_table_expression> [ ,...n ] ]
DELETE 
    [ TOP ( expression ) [ PERCENT ] ] 
    [ FROM ] 
    { <object> | rowset_function_limited 
      [ WITH ( <table_hint_limited> [ ...n ] ) ]
    }
    [ <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 
}

Argumenty

  • Z <common_table_expression>
    Określa tymczasowym o nazwie zestaw wyników, znane również jako wspólne tabela wyrażenie, zdefiniowany w zakres instrukcjaDELETE.zestaw wyników wywodzi się z instrukcjaSELECT.

    Typowe wyrażenia tabela można również z instrukcji SELECT, INSERT, aktualizacji i tworzenia WIDOKU.Aby uzyskać więcej informacji, zobacz Z common_table_expression (języka Transact-SQL).

  • TOP (expression) [ PERCENT ]
    Określa numer lub procent losowe wierszy, które zostaną usunięte.expressionmoże to być liczba lub procent wierszy.Wiersze w GÓRNEJ wyrażenie używane INSERT, UPDATE lub DELETE nie są rozmieszczone w dowolnej kolejności.

    Nawiasy rozgraniczającego expression w góry są wymagane INSERT, UPDATE i usuwanie instrukcji.Aby uzyskać więcej informacji, zobacz U góry (Transact-SQL).

  • Z
    Opcjonalne słowa kluczowego, które mogą być używane między Usuń słowo kluczowe i miejsce docelowejesttable_or_view_name, lub rowset_function_limited.

  • server_name
    Jest to nazwa serwera (przy użyciu nazwy serwer połączony lub OPENDATASOURCE funkcja jako nazwa serwera) na którym znajduje się tabela lub widok.Jeśli server_name jest określony, database_name i schema_name są wymagane.

  • database_name
    Jest to nazwa bazy danych.

  • schema_name
    Jest to nazwa schematu, do której należy dany tabela lub widoku.

  • table_or view_name
    Jest nazwą tabela lub widoku, z którego mają zostać usunięte wiersze.

    A table zmienną w jego zakresmoże być także używany jako tabela źródło w instrukcjaDELETE.

    Widok odwołuje się table_or_view_name należy aktualizowalna i odniesienia dokładnie jeden tabela bazowa w klauzula FROM widoku.Aby uzyskać więcej informacji na temat widoków aktualizowalna zobacz CREATE VIEW (Transact-SQL).

  • rowset_function_limited
    Jest OTWÓRZKWERENDĘ lub OPENROWSET funkcja, z zastrzeżeniem możliwości dostawca .Aby uzyskać więcej informacji na temat możliwości wymagane przez dostawca, zobacz AKTUALIZOWANIE i usuwanie wymagań dla dostawców OLE DB.

  • Z ()<table_hint_limited> [... n] )
    Określa wskazówki tabela , które są dozwolone dla miejsce docelowe tabela.Słowo kluczowe z i nawiasy są wymagane.NOLOCK i READUNCOMMITTED nie są dozwolone.Aby uzyskać więcej informacji na temat wskazówek dotyczących tabela , zobacz Wskazówki tabel (Transact-SQL).

  • <OUTPUT_Clause>
    Zwraca usunięte wiersze lub wyrażeń na nich oparte, w ramach operacji usuwania.Dane wyjściowe klauzula nie jest obsługiwana w sprawozdaniu wszelkie DML docelowej zdalnego tabel lub widoków.Aby uzyskać więcej informacji, zobacz Klauzula wyjściowy (Transact-SQL).

  • Z <table_source>
    Określa dodatkowe z klauzula.To Transact-SQL rozszerzenia do usunięcia umożliwia określanie danych z <table_source> i usunięcie odpowiednich wierszy z tabela w polu od pierwszej klauzula.

    Rozszerzenie to, określając łączyć, można zamiast podzapytanie w klauzula WHERE do identyfikowania wierszy do usunięcia.

    Aby uzyskać więcej informacji, zobacz Z języka Transact-SQL).

  • W PRZYPADKU GDY
    Określa warunki, używane do ograniczania liczby wierszy, które są usuwane.Jeśli klauzula WHERE nie jest podany, DELETE Usuwa wszystkie wiersze z tabela.

    Istnieją dwa rodzaje operacji usuwania, w zależności od tego, jakie jest określone w klauzulaWHERE:

    • Usuwa wyszukiwanych określ warunek wyszukiwania w celu zakwalifikowania wiersze do usunięcia.Na przykład, gdy column_name = value.

    • Usuwa pozycjonowane umożliwia określanie kursorBIEŻĄCEJ Z klauzula .Operacja usuwania występuje w bieżącej pozycji kursor.Może to być bardziej dokładne niż wyszukiwanych DELETE instrukcja używający WHERE search_condition klauzula w celu zakwalifikowania wierszy, które mają być usunięte.Wyszukiwanych instrukcja DELETE Usuwa wiele wierszy, jeżeli warunek wyszukiwania nie identyfikuje pojedynczego wiersza.

  • <search_condition>
    Określa warunki ograniczaniu wierszy, które mają zostać usunięte.Nie jest ograniczona do liczby predykatów, które mogą być zawarte w warunek wyszukiwania.Aby uzyskać więcej informacji, zobacz Warunek wyszukiwania (Transact-SQL).

  • PRĄD
    Określa usunięcie odbywa się w bieżącym położeniu określonym kursor.

  • GLOBALNE
    Określa, żecursor_name odnosi się do globalnego kursor.

  • cursor_name
    Jest nazwą Otwórz kursor , z której dokonywane jest pobranie.Jeśli globalnym i lokalnym kursor o nazwie cursor_name istnieje, ten argument odnosi się do globalnego kursor , jeżeli określono globalne; w przeciwnym wypadku odnosi się kursorlokalny.kursor należy zezwolić na aktualizacje.

  • cursor_variable_name
    Jest nazwą zmiennej kursor .Zmienna kursor musi odwoływać się kursor , która umożliwia aktualizacje.

  • OPTION ( <query_hint> [ ,... n] )
    Są słowa kluczowe, które wskazują, że wskazówek dotyczących optymalizacji są używane do dostosowywania sposobu Aparat baz danych przetwarza instrukcja.Aby uzyskać więcej informacji, zobacz Wskazówki kwerendy (Transact-SQL).

Uwagi

DELETE można użyć w treści funkcja zdefiniowanej przez użytkownika, jeśli obiekt modyfikowany jest table zmienną.

instrukcja DELETE może się nie powieść, jeśli narusza wyzwalacza lub próbuje usunąć wiersz zawiera odwołanie do danych w innej tabela z ograniczenia na klucz OBCY.Jeśli DELETE Usuwa wiele wierszy, jednej z usuniętych wierszy narusza ograniczenie lub wyzwalacza, anulowane instrukcja , zwracany jest błąd i żadne wiersze są usuwane.

Podczas usuwania instrukcja napotka błąd arytmetyczny (przepełnienia, dzielenie przez zero lub błąd domena ) występujących w trakcie oceny wyrażenie Aparat baz danych obsługuje te błędy, tak jakby ustawienie ARITHABORT jest zestaw na.Reszta partia zostanie anulowany i zwracany jest komunikat o błędzie.

Ustawienie opcji ustaw ROWCOUNT jest ignorowane dla instrukcji DELETE przeciwko zdalnego tabele i widoki na podzielonym na partycje lokalnych i zdalnych.

Jeśli chcesz usunąć wszystkie wiersze w tabelaużyć instrukcja DELETE bez określania klauzulaWHERE, lub OBCIĄĆ tabelę.OBCIĄĆ tabelę jest szybsza niż DELETE i wykorzystująca mniejszą ilość zasobów dziennika systemu i transakcji.

Usuwanie wierszy z sterty

Jeśli wiersze są usuwane z sterty Aparat baz danych mogą używać wiersza lub strona blokowania dla operacji.W wyniku strony wprowadzone puste przez operacji usuwania pozostają przydzielone do sterty.Gdy nie są dealokowane puste strony, skojarzony miejsca nie można użyć ponownie przez inne obiekty w bazie danych.

Aby usunąć wiersze w sterty i Cofnij przydzielanie strony, użyj jednej z następujących metod.

  • Określ wskazówkę TABLOCK w instrukcjaDELETE.Za pomocą wskazówki TABLOCK powoduje, że operacja usuwania przejmuje udostępnionego blokada tabela zamiast wiersza lub strona blokada.Dzięki temu stron do przydzielenia.Aby uzyskać więcej informacji na temat wskazówka TABLOCK, zobacz Wskazówki tabel (Transact-SQL).

  • Jeśli wszystkie wiersze są usuwane z tabelaza pomocą OBCIĄĆ tabelę.

  • Tworzenie indeks klastrowany na stercie, przed usunięciem wiersze.Po usunięciu wierszy, można usunąć indeks klastrowany .Ta metoda jest czasochłonne niż poprzednie metody więcej czas i wykorzystuje więcej zasobów tymczasowych.

Aby uzyskać więcej informacji na temat blokowania, zobacz Blokowanie w aparacie bazy danych.

Za pomocą wyzwalacz INSTEAD OF na akcje usuwania

Po zdefiniowaniu wyzwalacza INSTEAD OF DELETE działań przeciwko tabela lub widoku wyzwalacza wykonuje zamiast instrukcjaDELETE.We wcześniejszych wersjach SQL Server obsługują tylko po wyzwalaczy przy USUWANIU i innych sprawozdań modyfikacji danych.klauzula FROM nie można określić w DELETE instrukcja , która odwołuje się, bezpośrednio lub pośrednio, widok z wyzwalacza INSTEAD OF, zdefiniowane na nim.Aby uzyskać więcej informacji na temat zamiast wyzwalaczy, zobacz CREATE TRIGGER (Transact-SQL).

Uprawnienia

Usuń uprawnienia są wymagane wtabela miejsce docelowe. Jeśli instrukcja zawiera klauzulaWHERE wymagane są uprawnienia SELECT.

Usuń domyślne uprawnienia do członków sysadmin stała rola serwera db_owner i db_datawriter stałe role bazy danych i właściciela tabela .Członkowie sysadmin, db_owneroraz db_securityadmin role i właściciela tabela można przenieść uprawnienia do innych użytkowników.

Przykłady

A.Przy użyciu nie klauzulaDELETE

W następującym przykładzie usunięto wszystkie wiersze z SalesPersonQuotaHistory tabela ponieważ klauzula WHERE nie jest używane do ograniczania liczby usunięte wiersze.

USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory;
GO

B.Przy użyciu DELETE na zestaw wierszy

W następującym przykładzie usunięto wszystkie wiersze z ProductCostHistory tabela , w której wartość w StandardCost kolumna jest więcej niż 1000.00.

USE AdventureWorks2008R2;
GO
DELETE FROM Production.ProductCostHistory
WHERE StandardCost > 1000.00;
GO

C.Przy użyciu DELETE na bieżący wiersz kursor

W następującym przykładzie usunięto jeden wiersz z EmployeePayHistory tabela przy użyciu kursor , o nazwie complex_cursor.Operacja usuwania dotyczy tylko jeden wiersz aktualnie pobieranych z kursor.

USE AdventureWorks2008R2;
GO
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.Przy użyciu DELETE oparta na podzapytanie i rozszerzeniem języka Transact -SQL

W poniższym przykładzie Transact-SQL rozszerzenie służy do usuwania rekordów z tabela bazowa , która jest oparta na łączyć lub skorelowane podzapytanie.Pierwszy DELETEinstrukcja zawiera rozwiązania zgodne z ISO podzapytanie , a drugi DELETEzawierainstrukcja Transact-SQL rozszerzenia.Zarówno kwerendy Usuń wiersze z SalesPersonQuotaHistory tabela na podstawie roku-do-data sprzedaży przechowywane w SalesPerson tabela.

-- SQL-2003 Standard subquery

USE AdventureWorks2008R2;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
WHERE BusinessEntityID IN 
    (SELECT BusinessEntityID 
     FROM Sales.SalesPerson 
     WHERE SalesYTD > 2500000.00);
GO
-- Transact-SQL extension
USE AdventureWorks2008R2;
GO
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

E.Usuń przy użyciu klauzulaTOP

W następującym przykładzie usunięto 2.5 procent wierszy (27 wierszy) w ProductInventory tabela.

USE AdventureWorks2008R2;
GO
DELETE TOP (2.5) PERCENT 
FROM Production.ProductInventory;
GO

F.Przy użyciu danych wyjściowych klauzulaDELETE

Następujący przykład przedstawia sposób zapisywania wyniki DELETEwinstrukcja zmiennej tabela .

USE AdventureWorks2008R2;
GO
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

G.Dane wyjściowe przy użyciu from_table_name w instrukcjaDELETE

W następującym przykładzie usunięto wiersze w ProductProductPhoto tabela na podstawie kryteriów wyszukiwania określonych w FROM klauzula DELETE instrukcja.OUTPUTklauzula zwraca kolumny z tabela usunięty, DELETED.ProductID, DELETED.ProductPhotoID, a kolumny z Producttabela. Jest on używany w FROM klauzula , aby określić wiersze do usunięcia.

USE AdventureWorks2008R2;
GO
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