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

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure даAzure Synapse Analytics (хранилище данных SQL) даParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Удаляет одну или несколько строк из таблицы или представления в SQL ServerSQL Server.Removes one or more rows from a table or view in SQL ServerSQL Server.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

Синтаксис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 SQL Data Warehouse and Parallel Data Warehouse  
  
DELETE FROM [database_name . [ schema ] . | schema. ] table_name    
    [ WHERE <search_condition> ]   
    [ OPTION ( <query_options> [ ,...n ]  ) ]  
[; ]  

АргументыArguments

WITH <common_table_expression>WITH <common_table_expression>
Задает временный именованный результирующий набор, также называемый обобщенным табличным выражением, который определяется в области действия инструкции DELETE.Specifies the temporary named result set, also known as common table expression, defined within the scope of the DELETE statement. Результирующий набор получается из инструкции SELECT.The result set is derived from a SELECT statement.

Обобщенные табличные выражения также можно использовать в инструкциях SELECT, INSERT, UPDATE и CREATE VIEW.Common table expressions can also be used with the SELECT, INSERT, UPDATE, and CREATE VIEW statements. Дополнительные сведения см. в разделе WITH common_table_expression (Transact-SQL).For more information, see WITH common_table_expression (Transact-SQL).

TOP ( expression ) [ PERCENT ]TOP (expression) [ PERCENT ]
Задает количество или процент удаляемых случайных строк.Specifies the number or percent of random rows that will be deleted. expression может быть либо числом, либо процентом от числа строк.expression can be either a number or a percent of the rows. Строки, на которые ссылается выражение TOP, используемое с инструкциями INSERT, UPDATE и DELETE, не упорядочиваются.The rows referenced in the TOP expression used with INSERT, UPDATE, or DELETE are not arranged in any order. Дополнительные сведения см. в разделе TOP (Transact-SQL).For more information, see TOP (Transact-SQL).

FROMFROM
Необязательное ключевое слово, которое можно использовать между ключевым словом DELETE и целевым аргументом table_or_view_name или rowset_function_limited.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
Псевдоним, заданный в предложении FROM table_source и представляющий таблицу или представление, строки которых будут удалены.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
Область применения: SQL Server 2008SQL Server 2008 и более поздних версий.Applies to: SQL Server 2008SQL Server 2008 and later.

Имя сервера (с использованием имени связанного сервера или функции OPENDATASOURCE в качестве имени сервера), на котором расположена таблица или представление.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. Если указано server_name, необходимо указать database_name и schema_name.If server_name is specified, database_name and schema_name are required.

database_namedatabase_name
Имя базы данных.The name of the database.

schema_nameschema_name
Имя схемы, которой принадлежит таблица или представление.The name of the schema to which the table or view belongs.

table_or_view_nametable_or_view_name
Имя таблицы или представления, откуда удаляются строки.The name of the table or view from which the rows are to be removed.

Табличную переменную в пределах ее области действия также можно использовать в качестве источника таблицы в инструкции DELETE.A table variable, within its scope, also can be used as a table source in a DELETE statement.

Представление, на которое ссылается аргумент table_or_view_name, должно быть обновляемым и ссылаться только на одну базовую таблицу в предложении FROM определения представления.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. Дополнительные сведения об обновляемых представлениях см. в разделе CREATE VIEW (Transact-SQL).For more information about updatable views, see CREATE VIEW (Transact-SQL).

rowset_function_limitedrowset_function_limited
Область применения: SQL Server 2008SQL Server 2008 и более поздних версий.Applies to: SQL Server 2008SQL Server 2008 and later.

Функция OPENQUERY или OPENROWSET в зависимости от возможностей поставщика.Either the OPENQUERY or OPENROWSET function, subject to provider capabilities.

WITH ( <table_hint_limited> [... n] )WITH ( <table_hint_limited> [... n] )
Задает одно или несколько табличных указаний, разрешенных для целевой таблицы.Specifies one or more table hints that are allowed for a target table. Ключевое слово WITH и круглые скобки обязательны.The WITH keyword and the parentheses are required. Использование ключевых слов NOLOCK и READUNCOMMITTED запрещено.NOLOCK and READUNCOMMITTED are not allowed. Дополнительные сведения о табличных указаниях см. в разделе Табличные указания (Transact-SQL).For more information about table hints, see Table Hints (Transact-SQL).

<OUTPUT_Clause><OUTPUT_Clause>
Возвращает удаленные строки или выражения, основанные на них, как часть операции DELETE.Returns deleted rows, or expressions based on them, as part of the DELETE operation. Предложение OUTPUT не поддерживается ни в каких инструкциях DML, направленных на представления и удаленные таблицы.The OUTPUT clause is not supported in any DML statements targeting views or remote tables. Дополнительные сведения см. в статье Предложение OUTPUT (Transact-SQL).For more information, see OUTPUT Clause (Transact-SQL).

FROM table_sourceFROM table_source
Задает дополнительное предложение FROM.Specifies an additional FROM clause. Это расширение языка Transact-SQLTransact-SQL для инструкции DELETE позволяет задавать данные из <table_source> и удалять соответствующие строки из таблицы в первом предложении FROM.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.

Это расширение, в котором задается соединение, может быть использовано вместо вложенного запроса в предложении WHERE для указания удаляемых строк.This extension, specifying a join, can be used instead of a subquery in the WHERE clause to identify rows to be removed.

Дополнительные сведения см. в разделе FROM (Transact-SQL).For more information, see FROM (Transact-SQL).

WHEREWHERE
Указывает условия, используемые для ограничения числа удаляемых строк.Specifies the conditions used to limit the number of rows that are deleted. Если предложение WHERE не указывается, инструкция DELETE удаляет все строки из таблицы.If a WHERE clause is not supplied, DELETE removes all the rows from the table.

Предусмотрено два вида операций удаления в соответствии с тем, что указывается в предложении WHERE.There are two forms of delete operations based on what is specified in the WHERE clause:

  • Операции удаления с поиском указывают условие поиска для уточнения строк, которые будут удалены.Searched deletes specify a search condition to qualify the rows to delete. Например, WHERE column_name = value.For example, WHERE column_name = value.

  • Операции удаления по позиции используют предложение CURRENT OF для указания курсора.Positioned deletes use the CURRENT OF clause to specify a cursor. Удаление осуществляется в текущей позиции курсора.The delete operation occurs at the current position of the cursor. Эта операция может быть более точной, чем инструкция DELETE по найденному, которая использует предложение WHERE search_condition для указания удаляемых строк.This can be more accurate than a searched DELETE statement that uses a WHERE search_condition clause to qualify the rows to be deleted. Инструкция DELETE по найденному удаляет несколько строк, если условие поиска не определяет уникально одну строку.A searched DELETE statement deletes multiple rows if the search condition does not uniquely identify a single row.

<search_condition><search_condition>
Указывает ограничивающие условия для удаляемых строк.Specifies the restricting conditions for the rows to be deleted. Количество предикатов, которое может содержать условие поиска, не ограничено.There is no limit to the number of predicates that can be included in a search condition. Дополнительные сведения см. в разделе Условие поиска (Transact-SQL).For more information, see Search Condition (Transact-SQL).

CURRENT OFCURRENT OF
Указывает выполнение инструкции DELETE в текущей позиции указанного курсора.Specifies that the DELETE is performed at the current position of the specified cursor.

GLOBALGLOBAL
Указывает, что аргумент cursor_name ссылается на глобальный курсор.Specifies that cursor_name refers to a global cursor.

cursor_namecursor_name
Имя открытого курсора, из которого производится выборка.Is the name of the open cursor from which the fetch is made. Если существует как глобальный, так и локальный курсор с именем cursor_name, этот аргумент ссылается на глобальный курсор, если указан аргумент GLOBAL, в противном случае он ссылается на локальный курсор.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. Курсор должен позволять производить обновления.The cursor must allow updates.

cursor_variable_namecursor_variable_name
Имя переменной курсора.The name of a cursor variable. Переменная курсора должна содержать ссылку на курсор, обновления которого разрешены.The cursor variable must reference a cursor that allows updates.

OPTION ( <query_hint> [ , ... n] )OPTION ( <query_hint> [ ,... n] )
Ключевые слова, которые указывают, что указания оптимизатора применяются при настройке способа обработки инструкции компонентом Компонент Database EngineDatabase Engine.Keywords that indicate which optimizer hints are used to customize the way the Компонент Database EngineDatabase Engine processes the statement. Дополнительные сведения см. в разделе Указания запросов (Transact-SQL).For more information, see Query Hints (Transact-SQL).

РекомендацииBest Practices

Для удаления всех строк в таблице воспользуйтесь инструкцией TRUNCATE TABLE.To delete all the rows in a table, use TRUNCATE TABLE. Инструкция TRUNCATE TABLE выполняется быстрее, чем инструкция DELETE, и использует меньше системных ресурсов и ресурсов журнала транзакций.TRUNCATE TABLE is faster than DELETE and uses fewer system and transaction log resources. Инструкция TRUNCATE TABLE имеет ограничения, например, таблица не может участвовать в репликации.TRUNCATE TABLE has restrictions, for example, the table cannot participate in replication. Дополнительные сведения см. в разделе TRUNCATE TABLE (Transact-SQL)For more information, see TRUNCATE TABLE (Transact-SQL)

Для возврата в клиентское приложение количества удаленных строк используйте функцию @@ROWCOUNT.Use the @@ROWCOUNT function to return the number of deleted rows to the client application. Дополнительные сведения см. в статье @@ROWCOUNT (Transact-SQL).For more information, see @@ROWCOUNT (Transact-SQL).

Обработка ошибокError Handling

Для инструкции DELETE можно реализовать обработку ошибок, заключив инструкцию в конструкцию TRY…CATCH.You can implement error handling for the DELETE statement by specifying the statement in a TRY...CATCH construct.

При выполнении инструкции DELETE может произойти ошибка, если она нарушает триггер или пытается удалить строку, на которую ссылаются данные в другой таблице с помощью ограничения FOREIGN KEY.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. Если инструкция DELETE удаляет несколько строк и одна из удаленных строк нарушает триггер или ограничение, то эта инструкция отменяется, т.е. возвращается ошибка и строки не удаляются.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.

В случае арифметической ошибки (переполнение, деление на ноль или выход за пределы допустимых значений), возникающей в ходе вычисления выражения при выполнении инструкции DELETE, компонент Компонент Database EngineDatabase Engine будет обрабатывать эти ошибки, как если бы параметр SET ARITHABORT имел значение ON.When a DELETE statement encounters an arithmetic error (overflow, divide by zero, or a domain error) occurring during expression evaluation, the Компонент Database EngineDatabase Engine handles these errors as if SET ARITHABORT is set ON. Оставшаяся часть пакетной операции отменяется и возвращается сообщение об ошибке.The rest of the batch is canceled, and an error message is returned.

СовместимостьInteroperability

Инструкцию DELETE можно использовать в тексте определяемой пользователем функции, если изменяемым объектом является табличная переменная.DELETE can be used in the body of a user-defined function if the object modified is a table variable.

При удалении строки, содержащей столбец FILESTREAM, также удаляются и связанные с ней файлы файловой системы.When you delete a row that contains a FILESTREAM column, you also delete its underlying file system files. Базовые файлы удаляются сборщиком мусора FILESTREAM.The underlying files are removed by the FILESTREAM garbage collector. Дополнительные сведения см. в разделе Доступ к данным FILESTREAM с помощью Transact-SQL.For more information, see Access FILESTREAM Data with Transact-SQL.

Предложение FROM нельзя указывать в инструкции DELETE, ссылающейся (прямо или косвенно) на представление, в котором указан триггер INSTEAD OF.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. Дополнительные сведения о триггерах INSTEAD OF см. в разделе CREATE TRIGGER (Transact-SQL).For more information about INSTEAD OF triggers, see CREATE TRIGGER (Transact-SQL).

ОграниченияLimitations and Restrictions

При использовании выражения TOP в инструкции DELETE строки, на которые имеются ссылки, не упорядочиваются, а предложение ORDER BY не может быть прямо указано в этой инструкции.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. Если необходимо с помощью предложения TOP удалять строки в значимом хронологическом порядке, то вместе с ним в инструкции вложенного запроса выборки следует использовать ORDER BY.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. См. подраздел «Примеры» далее в этом разделе.See the Examples section that follows in this topic.

Предложение TOP не может быть использовано вместе с инструкцией DELETE для секционированных представлений.TOP cannot be used in a DELETE statement against partitioned views.

Режим блокировкиLocking Behavior

По умолчанию инструкция DELETE всегда получает монопольную блокировку (X) на таблицу, которую она изменяет, и держит блокировку до тех пор, пока транзакция не завершится.By default, a DELETE statement always acquires an exclusive (X) lock on the table it modifies, and holds that lock until the transaction completes. Если ресурс удерживается монопольной (X) блокировкой, то другие транзакции не могут изменять данные. Операции считывания будут допускаться только при наличии подсказки NOLOCK или уровня изоляции незафиксированной операции чтения.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. Можно переопределить поведение оптимизатора запросов по умолчанию с помощью табличных подсказок на время выполнения инструкции DELETE указанием другого способа блокировки, но использовать подсказки рекомендуется только опытным разработчикам и администраторам баз данных и только при крайней необходимости.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. Дополнительные сведения см. в разделе Табличные указания (Transact-SQL).For more information, see Table Hints (Transact-SQL).

Когда строки удаляются из кучи, компонент Компонент Database EngineDatabase Engine может использовать строку или страницу блокировки для операции.When rows are deleted from a heap the Компонент Database EngineDatabase Engine may use row or page locking for the operation. В результате пустые страницы, в которых выполняются операции удаления, остаются размещенными для кучи.As a result, the pages made empty by the delete operation remain allocated to the heap. Если их не освободить, занимаемое ими место не может быть использовано под другие объекты базы данных.When empty pages are not deallocated, the associated space cannot be reused by other objects in the database.

Чтобы удалить из кучи строки и освободить страницы, воспользуйтесь одним из следующих методов.To delete rows in a heap and deallocate pages, use one of the following methods.

  • Задайте указания TABLOCK в инструкции DELETE.Specify the TABLOCK hint in the DELETE statement. Использование TABLOCK приведет к тому, что при выполнении операции удаления будет установлена монопольная блокировка таблицы, а не блокировка строки или страницы,Using the TABLOCK hint causes the delete operation to take an exclusive lock on the table instead of a row or page lock. что позволит освободить страницы.This allows the pages to be deallocated. Дополнительные сведения об указании TABLOCK см. в разделе Табличные указания (Transact-SQL).For more information about the TABLOCK hint, see Table Hints (Transact-SQL).

  • Если из таблицы удаляются все строки, пользуйтесь инструкцией TRUNCATE TABLE.Use TRUNCATE TABLE if all rows are to be deleted from the table.

  • Перед удалением строк создайте в куче кластеризованный индекс.Create a clustered index on the heap before deleting the rows. Потом его можно будет удалить.You can drop the clustered index after the rows are deleted. Этот метод потребует больше времени и потребляет больше временных ресурсов.This method is more time consuming than the previous methods and uses more temporary resources.

Примечание

Пустые страницы можно удалить из кучи в любое время с помощью инструкции ALTER TABLE <table_name> REBUILD.Empty pages can be removed from a heap at any time by using the ALTER TABLE <table_name> REBUILD statement.

Режим ведения журналаLogging Behavior

Инструкция DELETE всегда полностью регистрируется в журнале.The DELETE statement is always fully logged.

безопасностьSecurity

РазрешенияPermissions

Разрешения DELETE необходимы для целевой таблицы.DELETE permissions are required on the target table. Разрешения SELECT также необходимы, если инструкция содержит предложение WHERE.SELECT permissions are also required if the statement contains a WHERE clause.

Разрешения DELETE назначаются по умолчанию членам предопределенной роли сервера sysadmin, предопределенных ролей базы данных db_owner и db_datawriter, а также владельцу таблицы.DELETE permissions default to members of the sysadmin fixed server role, the db_owner and db_datawriter fixed database roles, and the table owner. Члены ролей sysadmin, db_owner и db_securityadmin, а также владелец таблицы могут передавать разрешения другим пользователям.Members of the sysadmin, db_owner, and the db_securityadmin roles, and the table owner can transfer permissions to other users.

ПримерыExamples

КатегорияCategory Используемые элементы синтаксисаFeatured syntax elements
Основной синтаксисBasic syntax DELETEDELETE
Ограничение удаляемых строкLimiting the rows deleted WHERE • FROM • курсор •WHERE • FROM • cursor •
Удаление строк из удаленной таблицыDeleting rows from a remote table Связанный сервер • OPENQUERY, функция набора строк • OPENDATASOURCE, функция набора строкLinked server • OPENQUERY rowset function • OPENDATASOURCE rowset function
Сбор результатов для инструкции DELETECapturing the results of the DELETE statement OUTPUT, предложениеOUTPUT clause

Базовый синтаксисBasic Syntax

В примерах в этом разделе описывается базовая функциональность инструкции DELETE с помощью минимального необходимого синтаксиса.Examples in this section demonstrate the basic functionality of the DELETE statement using the minimum required syntax.

А.A. Использование инструкции DELETE без предложения WHEREUsing DELETE with no WHERE clause

Следующий пример удаляет все строки из таблицы SalesPersonQuotaHistory в базе данных AdventureWorks2012AdventureWorks2012 , поскольку не указано предложение WHERE, ограничивающее количество удаляемых строк.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  

Ограничение удаляемых строкLimiting the Rows Deleted

В примерах в этом разделе описываются способы ограничения количества удаляемых строк.Examples in this section demonstrate how to limit the number of rows that will be deleted.

Б.B. Использование предложения WHERE для удаления набора строкUsing the WHERE clause to delete a set of rows

Следующий пример удаляет все строки таблицы ProductCostHistory в базе данных AdventureWorks2012AdventureWorks2012 , у которых значение в столбце StandardCost больше 1000.00.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  

В следующем примере показано использование более сложного предложения WHERE.The following example shows a more complex WHERE clause. Предложение WHERE определяет два условия, которые должны быть выполнены для определения удаляемых строк.The WHERE clause defines two conditions that must be met to determine the rows to delete. Значение в столбце StandardCost должно быть в диапазоне от 12.00 до 14.00 , а значение в столбце SellEndDate должно быть равно NULL.The value in the StandardCost column must be between 12.00 and 14.00 and the value in the column SellEndDate must be null. В данном примере также выводится значение из функции @@ROWCOUNT, которое показывает количество удаленных строк.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. Использование курсора для определения удаляемой строкиUsing a cursor to determine the row to delete

Следующий пример удаляет одну строку из таблицы EmployeePayHistory в базе данных AdventureWorks2012AdventureWorks2012 с помощью курсора my_cursor.The following example deletes a single row from the EmployeePayHistory table in the AdventureWorks2012AdventureWorks2012 database using a cursor named my_cursor. Операция удаления затрагивает только одну строку, выбранную в данный момент курсором.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. Использование операторов объединения и вложенных запросов к данным в одной таблице для удаления строк в другой таблицеUsing joins and subqueries to data in one table to delete rows in another table

В следующих примерах показано два способа удаления строк в одной таблице на основании данных в другой таблице.The following examples show two ways to delete rows in one table based on data in another table. В обоих примерах из таблицы SalesPersonQuotaHistory в базе данных AdventureWorks2012AdventureWorks2012 будут удалены строки на основании сведений о продажах за текущий год, хранящихся в таблице SalesPerson.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. В первой инструкции DELETE показано основанное на вложенных запросах и совместимое с ISO решение, а во второй инструкции DELETE используется оператор FROM языка Transact-SQLTransact-SQL для объединения двух таблиц.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. Ограничение числа удаляемых строк с помощью ключевого слова TOPUsing TOP to limit the number of rows deleted

Если с инструкцией DELETE применяется предложение TOP (n), то операция удаления производится над n случайно выбранными строками.When a TOP (n) clause is used with DELETE, the delete operation is performed on a random selection of n number of rows. Следующий пример удаляет 20 случайных строк из таблицы PurchaseOrderDetail в базе данных AdventureWorks2012AdventureWorks2012, имеющих дату ранее 1 июля 2006 г.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  

Если необходимо с помощью предложения TOP удалять строки в значимом хронологическом порядке, то вместе с ним в инструкции вложенного запроса выборки следует использовать ORDER BY.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. Следующий запрос удаляет из таблицы PurchaseOrderDetail 10 строк, имеющих самую раннюю дату.The following query deletes the 10 rows of the PurchaseOrderDetail table that have the earliest due dates. Чтобы гарантировать удаление только 10 строк, столбец, указанный в инструкции подзапроса выборки (PurchaseOrderID) должен являться первичным ключом таблицы.To ensure that only 10 rows are deleted, the column specified in the subselect statement (PurchaseOrderID) is the primary key of the table. Использование неключевого столбца в инструкции подзапроса выборки может привести к удалению более чем 10 строк, если указанный столбец содержит повторяющиеся значения.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  

Удаление строк из удаленной таблицыDeleting Rows From a Remote Table

В примерах в этом разделе описаны способы удаления строк из удаленной таблицы с использованием в качестве ссылки на удаленную таблицу связанного сервера или функции, возвращающей набор строк.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. Удаленная таблица существует на другом сервере или экземпляре SQL Server.A remote table exists on a different server or instance of SQL Server.

Область применения: SQL Server 2008SQL Server 2008 и более поздних версий.Applies to: SQL Server 2008SQL Server 2008 and later.

Е.F. Удаление данных из удаленной таблицы с помощью связанного сервераDeleting data from a remote table by using a linked server

В следующем примере будет удалена строка из удаленной таблицы.The following example deletes rows from a remote table. Этот пример начинается с создания ссылки на удаленный источник данных с помощью хранимой процедуры sp_addlinkedserver.The example begins by creating a link to the remote data source by using sp_addlinkedserver. Имя связанного сервера, MyLinkServer, затем определяется как часть четырехчастного имени объекта в форме server.catalog.schema.object.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. Удаление данных из удаленной таблицы с помощью функции OPENQUERYDeleting data from a remote table by using the OPENQUERY function

В следующем примере выполняется удаление строк из удаленной таблицы с помощью вызова функции OPENQUERY , возвращающей набор строк.The following example deletes rows from a remote table by specifying the OPENQUERY rowset function. В этом примере используется имя связанного сервера, созданного в предыдущем примере.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. Удаление данных из удаленной таблицы с помощью функции OPENDATASOURCEDeleting data from a remote table by using the OPENDATASOURCE function

В следующем примере выполняется удаление строк из удаленной таблицы с помощью вызова функции OPENDATASOURCE, возвращающей набор строк.The following example deletes rows from a remote table by specifying the OPENDATASOURCE rowset function. Определите допустимое имя сервера для источника данных, используя формат server_name или server_name\instance_name.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;'  

Сбор результатов для инструкции DELETECapturing the results of the DELETE statement

И.I. Использование инструкции DELETE с предложением OUTPUTUsing DELETE with the OUTPUT clause

Следующий пример демонстрирует способы сохранения результатов инструкции DELETE в табличную переменную в базе данных AdventureWorks2012AdventureWorks2012.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. Использование предложения OUTPUT с аргументом <from_table_name> в инструкции DELETEUsing OUTPUT with <from_table_name> in a DELETE statement

Следующий пример удаляет строки в таблице ProductProductPhoto в базе данных AdventureWorks2012AdventureWorks2012 на основе критерия поиска, указанного в предложении FROM инструкции DELETE.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. Предложение OUTPUT возвращает столбцы из таблицы, в которой проводится удаление, DELETED.ProductID, DELETED.ProductPhotoIDи столбцы из таблицы Product .The OUTPUT clause returns columns from the table being deleted, DELETED.ProductID, DELETED.ProductPhotoID, and columns from the Product table. Оно используется в предложении FROM для указания удаляемых строк.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  

Примеры: Azure Synapse Analytics (хранилище данных SQL)Azure Synapse Analytics (SQL DW) и Параллельное хранилище данныхParallel Data WarehouseExamples: Azure Synapse Analytics (хранилище данных SQL)Azure Synapse Analytics (SQL DW) and Параллельное хранилище данныхParallel Data Warehouse

Л.K. Удаление всех строк из таблицыDelete all rows from a table

Следующий пример удаляет все строки из таблицы Table1, поскольку не указано предложение WHERE, ограничивающее количество удаляемых строк.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. Инструкция DELETE для удаления набора строк из таблицыDELETE a set of rows from a table

Следующий пример удаляет все строки таблицы Table1, у которых значение в столбце StandardCost больше 1000,00.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. Использование предложения LABEL с инструкцией DELETEUsing LABEL with a DELETE statement

В следующем примере используется метка с инструкцией DELETE.The following example uses a label with the DELETE statement.

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

О.N. Использование метки и указания запроса с инструкцией DELETEUsing a label and a query hint with the DELETE statement

Этот запрос показывает базовый синтаксис для использования указания на соединение с запросом с инструкцией INSERT.This query shows the basic syntax for using a query join hint with the DELETE statement. Дополнительные сведения об указаниях соединения и использовании предложения OPTION см. в статье Предложение OPTION (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 ) ;  

См. также:See 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)