DELETE (języka Transact-SQL)

Usuwa wiersze z tabela lub widoku.

Topic link iconKonwencje składni języka Transact-SQL

[ 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

  • WITH common_table_expression < >
    Określa wartość tymczasowym o nazwie wynik, znane również jako wspólne tabela wyrażenie, zdefiniowane w zakres instrukcja DELETE.Zestaw wyników jest określany na podstawie instrukcja SELECT.

    Typowe wyrażenia tabela można również z instrukcji SELECT, INSERT, UPDATE i CREATE VIEW.Aby uzyskać więcej informacji zobaczWITH common_table_expression (Transact-SQL).

  • TOP (expression) [ PERCENT ]
    Specifies the number or percent of random rows that will be deleted.expression can be either a number or a percent of the rows.Wiersze, do którego odwołuje się wyrażenie TOP używane INSERT, UPDATE lub DELETE nie są rozmieszczone w dowolnej kolejności.

    Nawiasy ograniczająca expression w TOP są wymagane w instrukcji INSERT, UPDATE i DELETE. Aby uzyskać więcej informacji zobaczTOP (Transact-SQL).

  • Z
    Jest opcjonalne słowa kluczowego, które mogą być używane między słowo kluczowe DELETE oraz miejsce docelowe table_or_view_name, lub rowset_function_limited.

  • server_name
    Jest to nazwa serwera (za pomocą nazwy serwer połączony, OPENDATASOURCE funkcja, jak nazwa serwera) w której znajduje się tabela lub widok.Jeśli server_name jest określony, database_name i schema_name są wymagane.

  • database_name
    Jest nazwą bazy danych.

  • schema_name
    To nazwa schematu, do której należy tabela lub widok.

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

    A table Zmienna w swoim zakresie, można także używać jako urządzenie źródłowe tabela w instrukcja DELETE.

    W widoku, do którego odnosi się table_or_view_name musi być możliwa i połącz dokładnie jednej tabela bazowa w klauzula FROM widoku. Aby uzyskać więcej informacji na temat widoków można aktualizować zobacz CREATE VIEW języka Transact-SQL).

  • rowset_function_limited
    Czy albo OPENQUERY or OPENROWSET funkcja zastrzeżeniem możliwości dostawca.Aby uzyskać więcej informacji na temat możliwości, wymagane przez dostawca zobacz UPDATE and DELETE Requirements for OLE DB Providers.

  • WITH ( <table_hint_limited> [... n] )
    Określa wskazówki tabela, które są dozwolone dla tabela miejsce docelowe.Słowo kluczowe WITH 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 do tabela (języka Transact-SQL).

  • <OUTPUT_Clause>
    Zwraca usunięte wiersze lub wyrażeń, w zależności od ich w ramach operacja usuwania.Klauzula wyjście nie jest obsługiwana w każdej instrukcji DML kierowanie widoków lub tabel zdalnego.Aby uzyskać więcej informacji zobaczKlauzula OUTPUT (języka Transact-SQL).

  • FROM table_source < >
    Określa dodatkową klauzulę FROM.To Transact-SQL rozszerzenie DELETE umożliwia określenie danych z <table_source> i usunięcie odpowiednich wierszy z tabela w pierwszym z klauzula.

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

    Aby uzyskać więcej informacji zobaczFROM (Transact-SQL).

  • GDZIE
    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, co to jest określone w klauzula WHERE:

    • Usuwa wyszukiwanych określony warunek wyszukiwania do kwalifikowania wierszy do usunięcia.Na przykład WHERE column_name = value.

    • Usuwa pozycjonowane umożliwiają określenie kursor klauzula CURRENT OF.Operacja usuwania występuje w bieżącej pozycji kursor.Może to być bardziej dokładny od wyszukiwanych instrukcja DELETE, która używa WHERE search_condition Klauzula do kwalifikowania wiersze, które mają zostać usunięte. Przeszukiwany instrukcja DELETE Usuwa wiele wierszy, jeśli warunek wyszukiwania nie jednoznacznie identyfikuje jeden wiersz.

  • <search_condition>
    Określa warunki ograniczaniu wiersze, które mają zostać usunięte.Nie jest ograniczona do liczby predykatów, które można uwzględnić w warunek wyszukiwania.Aby uzyskać więcej informacji zobaczSearch Condition (Transact-SQL).

  • PRĄD
    Określa, że DELETE jest wykonywane w bieżącym położeniu określonego kursor.

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

  • cursor_name
    To nazwa kursor otwarte, z której dokonywane jest pobrania.Jeśli globalnym i lokalnym kursor o nazwie cursor_name istnieje, ten argument odnosi się do globalnego kursor Jeśli GLOBAL jest określona; w przeciwnym razie, odwołuje się do lokalnego kursora. Kursor musi zezwolić na aktualizacje.

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

  • OPTION ( <query_hint> [ ,... n] )
    Czy słowa kluczowe, które wskazują, że używane są wskazówek dotyczących optymalizacji, aby dostosować sposób Database Engine przetwarza instrukcja. Aby uzyskać więcej informacji zobaczQuery Hints (Transact-SQL).

Remarks

DELETE można użyć w treści funkcja zdefiniowanej przez użytkownika, gdy modyfikowany obiekt jest table Zmienna.

Instrukcja DELETE może się nie powieść, jeśli narusza wyzwalacza lub próbuje usunąć wiersz, do którego odnosi się dane w innej tabela z ograniczeniem klucz obcy.Jeśli DELETE Usuwa wiele wierszy, a jednym z wierszy usunięto narusza wyzwalacza lub ograniczenia, instrukcja została anulowana, zwracany jest błąd i nie wiersze są usuwane.

Jeśli Instrukcja DELETE napotka błąd arytmetyczny (przepełnienia, dzielenie przez zero lub błąd domena) zachodzące podczas oceny wyrażenie Database Engine obsługuje te błędy, tak jakby ARITHABORT zestaw jest ustawiony na. Pozostała część partia jest anulowane, a następnie zwracany jest komunikat o błędzie.

Ustawienie opcji zestaw ROWCOUNT jest ignorowana dla instrukcji DELETE przed zdalnego tabele i widoki na podzielonym na partycje lokalnych i zdalnych.

Jeśli chcesz usunąć wszystkie wiersze w tabela, użyj instrukcja DELETE bez określania klauzula WHERE lub OBCIĄĆ tabela.PRZYCINANIE tabela jest szybsze niż DELETE i wykorzystująca mniejszą ilość zasobów dziennika systemu i transakcji.

Usuwanie wierszy z sterty

Gdy wiersze są usuwane z sterty Database Engine mogą używać wiersza lub strona blokowania dla tej operacji. W rezultacie wprowadzone puste przez operację usuwania stron pozostają przydzielonego do sterty.W przypadku pustych stron nie są przydziałów, skojarzone miejsca nie mogą być ponownie użyte przez inne obiekty w bazie danych.

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

  • Określ wskazówkę dotyczącą TABLOCK w instrukcja DELETE.Za pomocą wskazówka TABLOCK powoduje, że operacja usuwania zostały udostępnione blokadę tabela, a nie wiersz lub blokowanie strona.Dzięki temu stron, aby być przydziałów.Aby uzyskać więcej informacji na temat TABLOCK wskazówki zobacz Wskazówki do tabela (języka Transact-SQL).

  • Jeśli wszystkie wiersze mają zostać usunięte z tabela za pomocą OBCINANIA tabela.

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

Aby uzyskać więcej informacji na temat blokowania Zobacz Blokowanie w aparat bazy danych.

Za pomocą wyzwalacz Z INSTEAD na akcje DELETE

Po zdefiniowaniu wyzwalacz INSTEAD Z działań DELETE przed tabela lub widok, wyzwalacz jest wykonywany zamiast instrukcja DELETE.We wcześniejszych wersjach SQL Server obsługują tylko po wyzwalacze DELETE i inne instrukcje modyfikacji danych. Klauzula FROM nie może być określony w instrukcja DELETE, która odwołuje się do, bezpośrednio lub pośrednio, widok z wyzwalacz Z INSTEAD zdefiniowane na nim.Aby uzyskać więcej informacji o, a nie z wyzwalaczy zobacz CREATE TRIGGER (języka Transact-SQL).

Uprawnienia

DELETE uprawnienia są wymagane w tabela miejsce docelowe.SELECT uprawnienia są również wymagane, jeśli instrukcja zawiera WHERE klauzula.

DELETE domyślnych uprawnień dla członków sysadmin stała rola serwera db_owner and db_datawriter stałe role bazy danych i właściciela tabela.Członkowie sysadmin, db_owner, and the db_securityadmin ról i właściciela tabela mogą przesyłać uprawnień innym użytkownikom.

Przykłady

A.Przy użyciu klauzula WHERE nie DELETE

W następującym przykładzie usunięto wszystkie wiersze z SalesPersonQuotaHistory Tabela, ponieważ klauzulę WHERE nie jest używana do ograniczania liczby wierszy usunięte.

B.Za pomocą DELETE na zestawie wierszy

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

C.Za pomocą DELETE w bieżącym wierszu kursor

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

D.Za pomocą DELETE oparta na podkwerendzie i za pomocą rozszerzenia języka Transact-SQL

W poniższym przykładzie Transact-SQL rozszerzenie służy do usuwania rekordów z podstawowej tabela, która jest oparta na sprzężeniu lub skorelowana podkwerenda. Pierwszy DELETE Instrukcja zawiera rozwiązania zgodne z ISO podkwerenda, a drugi DELETE Pokazuje zestawienie Transact-SQL rozszerzenie. Zarówno kwerendy Usuń wiersze z SalesPersonQuotaHistory Tabela oparta na sprzedaż od początku roku, przechowywane w SalesPerson Tabela.

E.DELETE przy użyciu klauzula TOP

W następującym przykładzie zostanie usunięty 2.5 procent wierszy (27 wierszy) w ProductInventory Tabela.

F.DELETE przy użyciu klauzula wyjście

W poniższym przykładzie pokazano sposób zapisywania wyniki DELETE Instrukcja do zmiennej tabela.

G.Przy użyciu wyjście z from_table_name w instrukcja DELETE

W następującym przykładzie usunięto wiersze ProductProductPhoto Tabela na podstawie kryteriów wyszukiwania określonych w FROM Klauzula DELETE Instrukcja. The OUTPUT klauzula returns columns from the tabela being deleted, DELETED.ProductID, DELETED.ProductPhotoID, and columns from the Product tabela. To jest używane w FROM Klauzula, aby określić wiersze do usunięcia.