Sil (Transact-sql)
Bir tablo veya görünümde bir veya daha fazla satır kaldırır SQL Server 2012.
Transact-SQL Sözdizim Kuralları
Sözdizimi
[ 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
}
Bağımsız değişkenler
İLE <common_table_expression>
Geçici sonuç adlı kümesi, delete deyimi kapsamı içinde tanımlı olarak da bilinen ortak tablo ifade, belirtir. Sonuç kümesi, bir select deyimi türetilir.Ortak tablo ifadeleri, select, INSERT, update ve create VIEW deyimleri ile de kullanılabilir. Daha fazla bilgi için, bkz. WITH Common.
TOP (expression) [ PERCENT ]
Numarasını veya silinecek rastgele satır yüzdesini belirtir. expressionbir sayı veya satırları yüzdesi olabilir. INSERT, update veya delete ile kullanılan en iyi ifade içinde başvurulan satır herhangi bir sırayla düzenlenmiş değil. Daha fazla bilgi için, bkz. TOP (Transact-sql).Kaynak
delete anahtar ile hedef arasında kullanılan isteğe bağlı bir anahtar sözcük table_or_view_name, ya rowset_function_limited.table_alias
Kimden belirlenen diğer adı table_sourcetablo veya görünüm içinden olan silinecek satırları gösteren yan.server_name
Sunucu adı (bir bağlantılı sunucu adı kullanarak veya opendatasource işlevi sunucu adı olarak) tablo veya görünüm olduğu yer. Eğer server_namebelirtilen database_nameve schema_namegerekli.database_name
Veritabanı adı.schema_name
Tablo veya Görünüm ait olduğu şema adı.table_or view_name
Tablo veya görünüm içinden kaldırılacak satırları olan adı.Kapsam içinde bir tablo değişkeni, delete deyimi tablo kaynağı olarak da kullanılabilir.
Görünüm tarafından başvurulan table_or_view_name güncelleştirilebilir olmalı ve Görünüm tanımı, from yan tümcesinde bir temel tablo başvurusu. Güncelleştirilebilir görünümler hakkında daha fazla bilgi için bkz: CREATE VIEW (Transact-SQL).
rowset_function_limited
Ya da openquery veya openrowset fonksiyonu, sağlayıcı yeteneklerini tabidir.İLE (<table_hint_limited> [... n] )
Hedef tablo için izin verilen bir veya daha fazla tablo ipuçları belirtir. WITH anahtar sözcük ve ayraçlar gereklidir. nolock ve READUNCOMMITTED izin verilmez. Tablo ipuçları hakkında daha fazla bilgi için bkz: Tablo ipuçları (Transact-sql).<OUTPUT_Clause>
Döner silinmiş satırlar veya silme işlemi bir parçası olarak, bunları temel ifadeler. output yan tümcesi görünümleri veya uzak tabloları hedefleyen herhangi bir dml deyimleri desteklenmez. Daha fazla bilgi için, bkz. output Yantümcesi (Transact-sql).FROM table_source
Ek bir from yan belirtir. Bu Transact-SQLsilmek için uzantı verileri belirtme sağlar <table_source > ve silinmesi buna karşılık gelen satırlar tablonun ilk başlangıç fıkra.Bir birleşim belirterek, bu uzantı kaldırılacak satırları tanımlamak için where yan tümcesi alt sorgu yerine kullanılabilir.
Daha fazla bilgi için, bkz. FROM (Transact-sql).
BURADA
Silinen satır sayısını sınırlamak için kullanılan koşulları belirtir. where yan tümcesi sağlanmayan, Sil tüm satırları tablodan kaldırır.where yan tümcesinde belirtilen tarih alarak silme işlemleri iki biçimi vardır:
Aranan siler silmek için satır nitelemek için bir arama koşulu belirtin. Örneğin, nerede column_name= value.
Konumlandırılmış siler ve current of yan tümcesi bir imleç belirtmek için kullanın. Silme işlemi, geçerli imleç konumu oluşur. Bu-ebilmek var olmak daha doğru bir yerde kullandığı aranan delete deyimi search_conditionSilinecek satır nitelemek için yan. Arama koşulu tek bir satırı benzersiz şekilde tanımlamaz, aranan delete deyimi birden çok satırı siler.
<search_condition>
Silinecek satırları kısıtlama koşullarını belirtir. Bir arama koşulunda dahil edilebilir yüklemler sayısına bir sınır yoktur. Daha fazla bilgi için, bkz. Arama koşulu (Transact-sql).MEVCUT
Sil geçerli belirtilen imleç konumu gerçekleştirilen belirtir.KÜRESEL
Belirleyen cursor_namegenel imleci için başvuruyor.cursor_name
Açık imleç GETIRME yapıldığı adıdır. Eğer hem global hem de bir yerel imleç adı cursor_namevar, bu global belirtilirse; genel imleç gösterir Aksi takdirde, yerel imleç için başvurur. Imleç güncelleştirmeleri izin vermelidir.cursor_variable_name
Bir imleç değişken adı. Imleç değişken güncelleştirmelere olanak veren bir imleç başvuru gerekir.OPTION ( <query_hint> [ ,... n] )
Hangi Doktoru ipuçları şeklini özelleştirmek için kullanılan gösteren anahtar kelimeler Veritabanı Altyapısıdeyimi işler. Daha fazla bilgi için, bkz. Sorgu ipuçları (Transact-sql).
En İyi Yöntemler
Bir tablodaki tüm satırları silmek için kullanın truncate table. truncate table, delete hızlıdır ve daha az sistem ve işlem günlüğü kaynağı kullanır.
@@ rowcount Silinen satır sayısı istemci uygulamaya dönmek işlevi. Daha fazla bilgi için, bkz. @@ rowcount (Transact-sql).
Hata işleme
delete deyimi hata a denemek… deyimi belirterek uygulayabilirsinizcatch yapı.
Bu tetikleyici ihlal eden veya verilerin başka bir Tablo FOREIGN key kısıtlaması tarafından başvurulan bir sıra temizlemeye delete deyimi başarısız olabilir. Birden çok satır Sil kaldırır ve bir tetikleyici veya kısıtlama kaldırılacak satırları herhangi birini ihlal, deyimi iptal edilir, bir hata döndürülür ve hiçbir satır kaldırılır.
delete deyimi (taşma, sıfır ya da bir etki alanı hata bölme) aritmetik hata karşılaştığında ifade değerlendirme sırasında meydana gelen Veritabanı Altyapısısanki set ARITHABORT on olarak ayarlanmışsa, bu hatalar işler. Toplu işin geri kalanını iptal edilir ve bir hata iletisi döndürülür.
Birlikte Çalışabilirlik
Güncellenmiştir nesne bir tablo değişkeni ise kullanıcı tanımlı bir işlev gövdesinde delete kullanılabilir.
FILESTREAM sütun içeren bir satır sildiğinizde, ayrıca temel dosya sistem dosyalarını silin. FILESTREAM Çöp Toplayıcısı tarafından temel alınan dosyalar kaldırılır. Daha fazla bilgi için, bkz. Erişim FILESTREAM veri Transact-sql ile.
from yan tümcesi, bir görünümü üzerinde tanımlı bir INSTEAD of tetikleyicisi ile doğrudan veya dolaylı olarak başvuran delete deyiminde belirtilemez. Hakkında daha fazla bilgi için ıNSTEAD OF Tetikleyicileri, bakın CREATE TRIGGER (Transact-SQL).
Sınırlamalar ve Kısıtlamalar
ÜST Sil ile kullanıldığında, bulunulan satır herhangi bir sırayla düzenlenir değildir ve order by yan tümcesi doğrudan bu deyimi belirtilebilir değil. Anlamlı bir kronolojik sırayla satırları silmek için üst kullanmanız gerekiyorsa, top bir order by yan tümcesinde subselect deyimi ile birlikte kullanmanız gerekir. Bu konuda aşağıdaki örnekler bölümüne bakın.
top bölümlendirilmiş görünümlerde karşı bir delete deyiminde kullanılamaz.
Kilitleme davranışı
Varsayılan olarak, bir özel (x) kilidi değiştirir ve hareket tamamlanıncaya kadar bu kilit tutan tablo delete deyimi her zaman alır. Bir özel (x) kilidi ile başka hiçbir işlem verileri değiştirebilirsiniz; işlemleri yalnızca nolock ipucunu kullanımı ile gerçekleşecek veya UNCOMMITTED yalıtım düzeyi okuma okuyun. Başka bir kilitleme yöntemini belirterek delete deyimi süresi için bu varsayılan davranışı geçersiz kılmak için Tablo ipuçları belirtebilirsiniz, ancak ipuçları yalnızca son çare olarak deneyimli geliştiriciler ve veritabanı yöneticileri tarafından kullanılması önerilir. Daha fazla bilgi için, bkz. Tablo ipuçları (Transact-sql).
Ne zaman satır silinir bir öbekten Veritabanı Altyapısısatır ya da sayfa kilitleme işlemi için kullanabiliriz. Sonuç olarak, silme işlemi tarafından yapılan boş sayfaları yığın için ayrılan kalır. Ne zaman boş sayfaları kaldırıldı değil, ilişkili alanı veritabanındaki diğer nesneleri yeniden kullanılamaz.
Bir yığın satırları silin ve sayfaları ayırması için aşağıdaki yöntemlerden birini kullanın.
tablock İpucu delete deyimi belirtin. tablock ipucu kullanarak bir tablodaki bir satır yerine paylaşılan kilit ya da sayfa kilidi almak silme işlemi neden olur. Bu sayfaları kaldırıldı verir. tablock İpucu hakkında daha fazla bilgi için bkz: Tablo ipuçları (Transact-sql).
Tüm satırları tablodan silinecek truncate table kullanın.
Kümelenmiş bir dizin satırları silmeden önce öbek üzerinde oluşturun. Satırları silindikten sonra Kümelenmiş dizin bırakın. Bu yöntem daha zaman alıcı önceki yöntemlerden daha ve daha fazla geçici kaynak kullanır.
Günlüğe Yazma Davranışı
delete deyimi her zaman tam olarak kaydedilir.
Güvenlik
İzinler
SİLME izinleri hedef tablo için gereklidir. Deyim bir where yan tümcesi içeriyorsa, select izinleri de gereklidir.
Üyeleri için varsayılan izinleri silin sysadmin sabit sunucu rolü, db_owner ve db_datawriter sabit veritabanı rolleri ve tablo sahibi. Üyeleri sysadmin, db_ownerve db_securityadmin rol sahibi transfer ve izinleri diğer kullanıcılara.
Örnekler
Kategori |
Seçme sözdizimi öğeleri |
---|---|
Temel sözdizimi |
DELETE |
Silinen satır sınırlama |
NEREDE • • imleci • |
Uzak bir tablodan satırları silme |
Bağlantılı sunucu • openquery satır kümesi işlevi • opendatasource satır kümesi işlevi |
Ipuçlarını kullanarak sorgu en iyi duruma getiricisi varsayılan davranışını geçersiz kılma |
Tablo ipuçları • sorgu ipuçları |
delete deyimi sonuçları yakalama |
output yan tümcesi |
Temel sözdizimi
Bu bölümdeki örnekler, en az gerekli sözdizimini kullanarak delete deyimi temel işlevselliğini göstermektedir.
A.delete hiçbir where yan tümcesi ile kullanma
Aşağıdaki örnekte,'den tüm satırlar silinir SalesPersonQuotaHistoryçünkü tablo where yan tümcesi silinen satır sayısını sınırlamak için kullanılmaz.
USE AdventureWorks2012;
GO
DELETE FROM Sales.SalesPersonQuotaHistory;
GO
Silinen satır sınırlama
Bu bölümdeki örnekler, silinecek satır sayısını sınırlamak nasıl kullanıldığını göstermektedir.
A.Satır kümesi silmek için where yan tümcesini kullanarak
Aşağıdaki örnekte,'den tüm satırlar silinir ProductCostHistoryolan bir tabloda değer StandardCostsütun birden fazla 1000.00.
USE AdventureWorks2012;
GO
DELETE FROM Production.ProductCostHistory
WHERE StandardCost > 1000.00;
GO
Daha karmaşık bir where yan tümcesi aşağıdaki örnekte gösterilmektedir. where yan tümcesi silinecek satırları belirlemek için karşılanması gereken iki koşulu tanımlar. Değer StandardCostsütun arasında olmalıdır 12.00ve 14.00ve sütundaki değer SellEndDatenull olmalıdır. Örnek de değeri yazdırır @@ROWCOUNTsayısı dönmek için işlevi satır silindi.
USE AdventureWorks2012;
GO
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));
B.Silinecek satırı belirlemek için imleci kullanarak
Aşağıdaki örnek, tek bir satırı siler EmployeePayHistoryadlı bir imleç tablo kullanarak my_cursor. Silme işlemi, yalnızca geçerli imleci getirilen tek satır etkiler.
USE AdventureWorks2012;
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
C.Birleştirmeler ve alt sorgular verilere başka bir tablodaki satırları silmek için bir tablo kullanma
Aşağıdaki örnekler, başka bir tablodaki verilere dayalı bir tablodaki satırları silmek için iki yol Hem örneklerde, gelen satırları SalesPersonQuotaHistorytemel tabloda saklanan yıl tarihi satış dayalı silinir SalesPersontablosu. İlk DELETEISO uyumlu sorgu çözüm ve ikinci deyimi gösterir DELETEdeyimi gösterir Transact-SQLiki tabloyu birleştirin UZANTISINDAN.
-- SQL-2003 Standard subquery
USE AdventureWorks2012;
GO
DELETE FROM Sales.SalesPersonQuotaHistory
WHERE BusinessEntityID IN
(SELECT BusinessEntityID
FROM Sales.SalesPerson
WHERE SalesYTD > 2500000.00);
GO
-- Transact-SQL extension
USE AdventureWorks2012;
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
A.Silinen satır sayısını sınırlamak için top kullanma
Ne zaman bir üst (n) yan tümcesi, delete ile kullanıldığında, rastgele bir seçim üzerinde silme işlemi gerçekleştirilir nsatır sayısı. Aşağıdaki örnek 20rasgele satırların PurchaseOrderDetaildolayı sahip tablo 1 Temmuz 2006 ' önceki tarihleri.
USE AdventureWorks2012;
GO
DELETE TOP (20)
FROM Purchasing.PurchaseOrderDetail
WHERE DueDate < '20020701';
GO
Anlamlı bir kronolojik sırayla satırları silmek için üst kullanmanız gerekiyorsa, subselect deyimi içinde top sipariş ile birlikte kullanmanız gerekir. Aşağıdaki sorgu 10 satırları siler PurchaseOrderDetailen erken son tarihi olan tablo. Yalnızca 10 satır olmasını sağlamak için silinmiş subselect deyimi içinde belirtilen sütun (PurchaseOrderID) tablonun birincil anahtarıdır. Belirtilen sütun yinelenen değerler içeriyorsa bir nonkey sütun alt kullanarak 10'dan fazla satır silinmesine deyimi neden.
USE AdventureWorks2012;
GO
DELETE FROM Purchasing.PurchaseOrderDetail
WHERE PurchaseOrderDetailID IN
(SELECT TOP 10 PurchaseOrderDetailID
FROM Purchasing.PurchaseOrderDetail
ORDER BY DueDate ASC);
GO
Uzak bir tablodan satırları silme
Bu bölümdeki örnekler göstermek nasıl kullanarak uzak bir tablodan satır silmek için bir bağlantılı sunucu ya da bir satır kümesi işlevi uzak tablo başvurmak. Bir uzak tablo farklı bir sunucu veya SQL Server örneği üzerinde bulunmaktadır.
A.Bağlantılı bir sunucu kullanarak uzak bir tablodan veri silme
Aşağıdaki örnek, uzak bir tablodan satırları siler. Uzak veri kaynağına bir bağlantı kullanarak oluşturarak örnek başlıyor sp_addlinkedserver. Bağlantılı sunucu adı, MyLinkServer, sonra dört nesne adı şeklinde bir parçası olarak belirtilen 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
B.openquery işlevini kullanarak uzak bir tabloya veri silme
Aşağıdaki örnek, belirterek uzak bir tablodan satırları siler openquery satır kümesi işlevi. Örneğin önceki örnekte oluşturulmuş bağlantılı sunucu adı kullanılır.
DELETE OPENQUERY (MyLinkServer, 'SELECT Name, GroupName FROM AdventureWorks2012.HumanResources.Department
WHERE DepartmentID = 18');
GO
C.opendatasource işlevi kullanarak uzak bir tablodan veri silme
Aşağıdaki örnek, belirterek uzak bir tablodan satırları siler opendatasource satır kümesi işlevi. Biçimi kullanarak geçerli bir sunucu adı veri kaynağı belirtmek server_nameya server_name\instance_name.
DELETE FROM OPENDATASOURCE('SQLNCLI',
'Data Source= <server_name>; Integrated Security=SSPI')
.AdventureWorks2012.HumanResources.Department
WHERE DepartmentID = 17;'
delete deyimi sonuçları yakalama
A.delete output yan tümcesi ile kullanma
Aşağıdaki örnek sonuçlarını nasıl gösterir bir DELETEtablo değişkeni deyimine.
USE AdventureWorks2012;
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
B.ÇIKTIYI kullanarak <from_table_name> delete deyimi
Aşağıdaki örnek, satır siler ProductProductPhototabloda tanımlanan arama ölçütleri temel FROMyan DELETEdeyimi. OUTPUTYan tümcesi silinen, tablo sütunlarından döndürür DELETED.ProductID, DELETED.ProductPhotoIDve sütunlarından Producttablosu. Kullanılan bu FROMsilinecek satırları belirtmek için yan.
USE AdventureWorks2012;
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