Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure Synapse Analytics
Analiz Platformu Sistemi (PDW)
Microsoft Fabric'te
ambarMicrosoft Fabric'te SQL veritabanı
SQL Server'da bir tablo veya görünümdeki mevcut verileri değiştirir. Örnekler için bkz. Örnekler.
Transact-SQL söz dizimi kuralları
Syntax
-- Syntax for SQL Server and Azure SQL Database
[ WITH <common_table_expression> [...n] ]
UPDATE
[ TOP ( expression ) [ PERCENT ] ]
{ { table_alias | <object> | rowset_function_limited
[ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
}
| @table_variable
}
SET
{ column_name = { expression | DEFAULT | NULL }
| { udt_column_name.{ { property_name = expression
| field_name = expression }
| method_name ( argument [ ,...n ] )
}
}
| column_name { .WRITE ( expression , @Offset , @Length ) }
| @variable = expression
| @variable = column = expression
| column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression
| @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression
| @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression
} [ ,...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}
-- Syntax for Azure Synapse Analytics and Microsoft Fabric
[ WITH <common_table_expression> [ ,...n ] ]
UPDATE [ database_name . [ schema_name ] . | schema_name . ] table_name
SET { column_name = { expression | NULL } } [ ,...n ]
FROM [ database_name . [ schema_name ] . | schema_name . ] table_name
JOIN {<join_table_source>}[ ,...n ]
ON <join_condition>
[ WHERE <search_condition> ]
[ OPTION ( LABEL = label_name ) ]
[;]
<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
UPDATE [ database_name . [ schema_name ] . | schema_name . ] table_name
SET { column_name = { expression | NULL } } [ ,...n ]
[ FROM from_clause ]
[ WHERE <search_condition> ]
[ OPTION ( LABEL = label_name ) ]
[;]
Arguments
ILE <common_table_expression>
UPDATE deyimi kapsamında tanımlanan, ortak tablo ifadesi (CTE) olarak da bilinen geçici adlandırılmış sonuç kümesini veya görünümünü belirtir. CTE sonuç kümesi basit bir sorgudan türetilir ve UPDATE deyimi tarafından başvurulur.
Ortak tablo ifadeleri SELECT, INSERT, DELETE ve CREATE VIEW deyimleriyle de kullanılabilir. Daha fazla bilgi için bkz. WITH common_table_expression (Transact-SQL).
TOP (ifade) [ YÜZDE ]
Güncelleştirilen satırların sayısını veya yüzdesini belirtir.
ifade bir sayı veya satırların yüzdesi olabilir.
INSERT, UPDATE veya DELETE ile kullanılan TOP ifadesinde başvuruda bulunan satırlar herhangi bir sırada düzenlenmemiştir.
INSERT, UPDATE ve DELETE deyimlerinde TOP'da parantezler sınırlandırma ifadesi gereklidir. Daha fazla bilgi için bkz. TOP (Transact-SQL).
table_alias
Satırların güncelleştirildiği tabloyu veya görünümü temsil eden UPDATE yan tümcesinde belirtilen diğer ad.
server_name
Tablonun veya görünümün bulunduğu sunucunun adıdır (bağlı sunucu adı veya sunucu adı olarak OPENDATASOURCE işlevi kullanılır).
server_name belirtilirse database_name ve schema_name gerekir.
database_name
Veritabanının adıdır.
schema_name
Tablo veya görünümün ait olduğu şemanın adıdır.
table_or_view_name
Satırların güncelleştirildiği tablonun veya görünümün adıdır.
table_or_view_name tarafından başvuruda bulunılan görünümün güncelleştirilebilir olması ve görünümün FROM yan tümcesinde tam olarak bir temel tabloya başvurması gerekir. Güncelleştirilebilir görünümler hakkında daha fazla bilgi için bkz. CREATE VIEW (Transact-SQL).
rowset_function_limited
OpenQUERY veya OPENROWSET işlevi, sağlayıcı özelliklerine tabidir.
(<Table_Hint_Limited>) İLE
Hedef tablo için izin verilen bir veya daha fazla tablo ipucunu belirtir. WITH anahtar sözcüğü ve parantezler gereklidir. NOLOCK, READUNCOMMITTED, NOEXPAND ve diğerleri izin verilmez. Tablo ipuçları hakkında bilgi için bkz. Tablo İpuçları (Transact-SQL).
@
table_variable
Tablo değişkenlerini tablo kaynağı olarak belirtir.
SET
Güncelleştirilecek sütun veya değişken adlarının listesini belirtir.
column_name
Değiştirilecek verileri içeren bir sütundur.
column_nametable_or view_name içinde mevcut olmalıdır. Kimlik sütunları güncelleştirilemez.
expression
Tek bir değer döndüren bir değişken, değişmez değer, ifade veya alt seçim deyimidir (parantezler içinde).
İfade tarafından döndürülen değer, column_name veya @değişkendeki mevcut değerin yerini alır.
Note
Nchar, nvarchar ve ntext Unicode karakter veri türlerine başvuruda bulunurken, 'expression' ön ekinde 'N' büyük harfi bulunmalıdır. 'N' belirtilmezse, SQL Server dizeyi veritabanı veya sütunun varsayılan harmanlamasına karşılık gelen kod sayfasına dönüştürür. Bu kod sayfasında bulunmayan karakterler kaybolur.
DEFAULT
Sütun için tanımlanan varsayılan değerin sütundaki mevcut değeri değiştirmek olduğunu belirtir. Bu, sütunun varsayılan değeri yoksa ve null değerlere izin verecek şekilde tanımlanmışsa sütunu NULL olarak değiştirmek için de kullanılabilir.
{ +=-= | *=%= | | | | /=&= | ^= | |= }
Bileşik atama işleci:
+= Ekleme ve atama
-= Çıkarma ve atama
*= Çarpma ve atama
/= Bölme ve atama
%= Modulo ve atama
&= Bit düzeyinde AND ve atama
^= Bit düzeyinde XOR ve atama
|= Bit düzeyinde OR ve atama
udt_column_name
Kullanıcı tanımlı bir tür sütunudur.
property_name | field_name
Kullanıcı tanımlı bir türün ortak özelliği veya ortak veri üyesidir.
method_name(bağımsız değişken [ ,... n] )
Bir veya daha fazla bağımsız değişken alan udt_column_name statik olmayan bir genel mutator yöntemidir.
. WRITE (ifade,@Uzaklık,Uzunluk@)
column_name değerinin bir bölümünün değiştirildiğini belirtir.
ifadesi, column_name @Uzaklığı'ndan başlayan @Uzunlukbirimlerinin yerini alır. Bu yan tümceyle yalnızca varchar(max), nvarchar(max)veya varbinary(max) sütunları belirtilebilir.
column_name NULL olamaz ve tablo adı veya tablo diğer adıyla nitelenemez.
ifadesi , column_name kopyalanan değerdir. ifadesi , column_name türüne örtük olarak atanabilmelidir veya bunu değerlendirmelidir. İfade NULL olarak ayarlanırsa, @Uzunluk yoksayılır ve column_name değeri belirtilen @Uzaklıkta kesilir.
@ Uzaklık, ifadenin yazıldığı column_name depolanan değerdeki başlangıç noktasıdır. @ Uzaklık sıfır tabanlı bir bayt konumudur, bigint'tir ve negatif bir sayı olamaz. @Uzaklık NULL ise, güncelleştirme işlemi var olan column_name değerinin sonuna ifade ekler ve @Uzunluk yoksayılır. @Uzaklık, column_name değerinin bayt uzunluğundan büyükse, Veritabanı Altyapısı bir hata döndürür. @Uzaklık artı @Uzunluk sütundaki temel değerin sonunu aşarsa, silme işlemi değerin son karakterine kadar gerçekleşir.
@ Uzunluk, ifadeyle değiştirilen @Uzaklık'tan başlayarak sütundaki bölümün uzunluğudur. @ Uzunlukbüyük bir sayıdır ve negatif bir sayı olamaz. @Uzunluk NULL ise, güncelleştirme işlemi @Offset değerinden column_name değerinin sonuna kadar olan tüm verileri kaldırır.
Daha fazla bilgi için bkz . Büyük Değerli Veri Türlerini Güncelleştirme.
@
değişken
İfade tarafından döndürülen değere ayarlanmış bildirilen bir değişkendir.
SET @değişken = sütun = ifadesi , değişkeni sütunla aynı değere ayarlar. Bu@ değişkeni = güncelleştirme öncesi değerine ayarlayan SET değişken = sütunu olan sütunifadesinden farklıdır.
<OUTPUT_Clause>
UPDATE işleminin bir parçası olarak güncelleştirilmiş verileri veya ifadeleri buna göre döndürür. OUTPUT yan tümcesi, uzak tabloları veya görünümleri hedefleyen hiçbir DML deyiminde desteklenmez. Bu yan tümcenin bağımsız değişkenleri ve davranışı hakkında daha fazla bilgi için bkz. OUTPUT Yan Tümcesi (Transact-SQL).
table_source <>
Güncelleştirme işleminin ölçütlerini sağlamak için tablo, görünüm veya türetilmiş tablo kaynağının kullanıldığını belirtir. Daha fazla bilgi için bkz. from (Transact-SQL) .
Güncelleştirilmekte olan nesne FROM yan tümcesindeki nesneyle aynıysa ve FROM yan tümcesinde nesneye yalnızca bir başvuru varsa, nesne diğer adı belirtilebilir veya belirtilmeyebilir. Güncelleştirilmekte olan nesne FROM yan tümcesinde birden çok kez görünüyorsa, nesneye başvuruda tablo diğer adı belirtilmemelidir. FROM yan tümcesindeki nesneye yapılan diğer tüm başvurular bir nesne diğer adı içermelidir.
GÜNCELLEŞTIRME YERİNE tetikleyicisi olan bir görünüm, FROM yan tümcesine sahip bir UPDATE'in hedefi olamaz.
Note
FROM yan tümcesindeki OPENDATASOURCE, OPENQUERY veya OPENROWSET çağrıları, iki çağrıya aynı bağımsız değişkenler sağlansa bile güncelleştirmenin hedefi olarak kullanılan bu işlevlere yapılan tüm çağrılardan ayrı ve bağımsız olarak değerlendirilir. Özellikle, bu çağrılardan birinin sonucuna uygulanan filtre veya birleştirme koşullarının diğerinin sonuçları üzerinde hiçbir etkisi yoktur.
WHERE
Güncelleştirilen satırları sınırlayan koşulları belirtir. WHERE yan tümcesinin hangi biçimi kullanıldığına bağlı olarak iki güncelleştirme biçimi vardır:
Arama yapılan güncelleştirmeler, silinecek satırları niteleme amacıyla bir arama koşulu belirtir.
Konumlandırılan güncelleştirmeler, bir imleç belirtmek için CURRENT OF yan tümcesini kullanır. Güncelleştirme işlemi imlecin geçerli konumunda gerçekleşir.
<search_condition>
Güncelleştirilecek satırlar için karşılanacak koşulu belirtir. Arama koşulu, birleştirmenin temel aldığı koşul da olabilir. Arama koşuluna dahil edilebilecek koşul sayısıyla ilgili bir sınır yoktur. Koşullar ve arama koşulları hakkında daha fazla bilgi için bkz . Arama Koşulu (Transact-SQL).
GÜNCEL
Güncelleştirmenin belirtilen imlecin geçerli konumunda gerçekleştirildiğini belirtir.
WHERE CURRENT OF yan tümcesi kullanan konumlandırılmış güncelleştirme, imlecin geçerli konumundaki tek satırı güncelleştirir. Bu, güncelleştirilecek satırları niteleyen WHERE <search_condition> yan tümcesi kullanan bir arama güncelleştirmesinden daha doğru olabilir. Arama koşulu tek bir satırı benzersiz olarak tanımlamadığında, arama yapılan bir güncelleştirme birden çok satırı değiştirir.
GLOBAL
cursor_name genel bir imleç başvurduğunu belirtir.
cursor_name
Getirme işleminin yapılması gereken açık imlecin adıdır. Hem genel hem de adı cursor_name olan yerel bir imleç varsa, genel imleç belirtilirse bu bağımsız değişken genel imleç anlamına gelir; aksi takdirde, yerel imleç anlamına gelir. İmleç güncelleştirmelere izin vermelidir.
cursor_variable_name
İmleç değişkeninin adıdır.
cursor_variable_name güncelleştirmelere izin veren bir imleç başvurmalıdır.
SEÇENEK (<query_hint> [ ,... n ] )
Veritabanı Altyapısı'nın deyimini işleme biçimini özelleştirmek için iyileştirici ipuçlarının kullanıldığını belirtir. Daha fazla bilgi için bkz. Sorgu İpuçları (Transact-SQL).
En iyi yöntemler
İstemci uygulamasına @@ROWCOUNT eklenen satır sayısını döndürmek için işlevini kullanın. Daha fazla bilgi için bkz. @@ROWCOUNT (Transact-SQL).
Değişken adları, etkilenen eski ve yeni değerleri göstermek için UPDATE deyimlerinde kullanılabilir, ancak bu yalnızca UPDATE deyimi tek bir kaydı etkilediğinde kullanılmalıdır. UPDATE deyimi birden çok kaydı etkiliyorsa, her kayıt için eski ve yeni değerleri döndürmek için OUTPUT yan tümcesini kullanın.
Güncelleştirme işleminin ölçütlerini sağlamak için FROM yan tümcesini belirtirken dikkatli olun. Deyimi, güncelleştirilen her sütun oluşumu için yalnızca bir değer kullanılabilir olacak şekilde belirtilmemiş bir FROM yan tümcesi içeriyorsa, yani UPDATE deyimi belirleyici değilse, UPDATE deyiminin sonuçları tanımlanmamıştır. Örneğin, aşağıdaki betikteki UPDATE deyiminde, içindeki her iki satır da Table1 UPDATE deyimindeki FROM yan tümcesinin niteliklerini karşılar; ancak içindeki satırı güncelleştirmek için hangi satırın Table1 kullanıldığı tanımlanmamıştır Table2.
USE AdventureWorks2022;
GO
IF OBJECT_ID ('dbo.Table1', 'U') isn't NULL
DROP TABLE dbo.Table1;
GO
IF OBJECT_ID ('dbo.Table2', 'U') isn't NULL
DROP TABLE dbo.Table2;
GO
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
UPDATE dbo.Table2
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB
FROM dbo.Table2
INNER JOIN dbo.Table1
ON (dbo.Table2.ColA = dbo.Table1.ColA);
GO
SELECT ColA, ColB
FROM dbo.Table2;
ve FROM yan tümceleri birleştirildiğinde WHERE CURRENT OF de aynı sorun oluşabilir. Aşağıdaki örnekte, içindeki her iki satır da Table2 deyimindeki yan tümcenin FROM niteliklerini UPDATE karşılar. içindeki satırı güncelleştirmek için hangi satırın Table2Table1kullanılacağı tanımlanmamıştır.
USE AdventureWorks2022;
GO
IF OBJECT_ID ('dbo.Table1', 'U') isn't NULL
DROP TABLE dbo.Table1;
GO
IF OBJECT_ID ('dbo.Table2', 'U') isn't NULL
DROP TABLE dbo.Table2;
GO
CREATE TABLE dbo.Table1
(c1 INT PRIMARY KEY NOT NULL, c2 INT NOT NULL);
GO
CREATE TABLE dbo.Table2
(d1 INT PRIMARY KEY NOT NULL, d2 INT NOT NULL);
GO
INSERT INTO dbo.Table1 VALUES (1, 10);
INSERT INTO dbo.Table2 VALUES (1, 20), (2, 30);
GO
DECLARE abc CURSOR LOCAL FOR
SELECT c1, c2
FROM dbo.Table1;
OPEN abc;
FETCH abc;
UPDATE dbo.Table1
SET c2 = c2 + d2
FROM dbo.Table2
WHERE CURRENT OF abc;
GO
SELECT c1, c2 FROM dbo.Table1;
GO
Uyumluluk desteği
BIR UPDATE veya DELETE deyiminin hedef tablosuna uygulanan FROM yan tümcesindeki READUNCOMMITTED ve NOLOCK ipuçlarının kullanımı desteği, SQL Server'ın gelecekteki bir sürümünde kaldırılacaktır. Yeni geliştirme çalışmalarında bu bağlamda bu ipuçlarını kullanmaktan kaçının ve bunları kullanmakta olan uygulamaları değiştirmeyi planlayın.
Veri türleri
Tüm char ve nchar sütunları tanımlı uzunlukta sağ doldurulur.
ANSI_PADDING KAPALI olarak ayarlanırsa, yalnızca boşluk içeren dizeler dışında , varchar ve nvarchar sütunlarına eklenen verilerden sondaki tüm boşluklar kaldırılır. Bu dizeler boş bir dizeye kesilir. ANSI_PADDING AÇıK olarak ayarlanırsa, sondaki boşluklar eklenir. SQL Server için Microsoft SQL Server ODBC sürücüsü ve OLE DB Sağlayıcısı her bağlantı için otomatik olarak ANSI_PADDING AÇILDI olarak ayarlar. Bu, ODBC veri kaynaklarında veya bağlantı öznitelikleri veya özellikleri ayarlanarak yapılandırılabilir. Daha fazla bilgi için bkz. SET ANSI_PADDING (Transact-SQL).
Metin, ntext ve görüntü sütunlarını güncelleştirme
UPDATE ile metin, ntext veya görüntü sütununu değiştirmek sütunu başlatır, sütuna geçerli bir metin işaretçisi atar ve sütun NULL ile güncelleştirilmediği sürece en az bir veri sayfası ayırır.
Büyük metin, ntext veya görüntü veri bloklarını değiştirmek veya değiştirmek için UPDATE deyimi yerine WRITETEXT veya UPDATETEXT kullanın.
UPDATE deyimi hem kümeleme anahtarını hem de bir veya daha fazla metin, ntext veya görüntü sütununu güncelleştirirken birden fazla satır değiştirebiliyorsa, bu sütunlara yönelik kısmi güncelleştirme değerlerin tam değişimi olarak yürütülür.
Important
Ntext, metin ve görüntü veri türleri, Microsoft SQL Server'ın gelecekteki bir sürümünde kaldırılacaktır. Bu veri türlerini yeni geliştirme çalışmalarında kullanmaktan kaçının ve şu anda bunları kullanan uygulamaları değiştirmeyi planlayın. bunun yerine nvarchar(max), varchar(max)ve varbinary(max) kullanın.
Büyük değer veri türlerini güncelleştirme
kullanın.Varchar(max),@nvarchar@) veri türlerinin kısmi veya tam güncelleştirmesini gerçekleştirmek için WRITE (ifade,Uzaklık,Uzunluk) yan tümcesi.
Örneğin, varchar(max) sütununun kısmi bir güncelleştirmesi sütunun yalnızca ilk 200 baytını (ASCII karakterleri kullanılıyorsa 200 karakter) silebilir veya değiştirebilirken, tam güncelleştirme sütundaki tüm verileri silebilir veya değiştirebilir. öğesini seçin. Veritabanı kurtarma modeli toplu günlüğe kaydedilmiş veya basit olarak ayarlanmışsa, yeni veri ekleyen veya ekleyen YAZMA güncelleştirmeleri minimum düzeyde günlüğe kaydedilir. Mevcut değerler güncellendiğinde minimal kayıt tutma kullanılmaz. Daha fazla bilgi için bkz . İşlem Günlüğü (SQL Server).
UPDATE deyimi şu eylemlerden herhangi birini neden olduğunda Veritabanı Altyapısı kısmi bir güncelleştirmeyi tam güncelleştirmeye dönüştürür:
- Bölümlenmiş görünümün veya tablonun anahtar sütununu değiştirir.
- Birden fazla satırı değiştirir ve ayrıca tekli olmayan kümelenmiş dizinin anahtarını tutarsız bir değerle güncelleştirir.
öğesini kullanamazsınız . BIR NULL sütununu güncelleştirmek veya column_name değerini NULL olarak ayarlamak için WRITE yan tümcesi.
@ Uzaklık ve @Uzunluk , varbinary ve varchar veri türleri için bayt cinsinden ve nvarchar veri türü için bayt çiftlerinde belirtilir. Dize veri türü uzunlukları hakkında daha fazla bilgi için bkz. char ve varchar (Transact-SQL) ve nchar ve nvarchar (Transact-SQL).
En iyi performans için verilerin 8040 bayt'ın katları olan öbek boyutlarına eklenmesini veya güncelleştirilmiş olmasını öneririz.
Sütun tarafından değiştirildiyse. WRITE yan tümcesine, sütunun tam değeri olan output yan tümcesinde (silinmeden önceki görüntü) başvurulur.column_name veya eklendikten sonra resmi.column_name, tablo değişkeninde belirtilen sütuna döndürülür. Aşağıdaki örnek R'ye bakın.
ile aynı işlevselliği elde etmek için . DIĞER karakter veya ikili veri türleriyle WRITE yazın, STUFF (Transact-SQL) kullanın.
Kullanıcı Tanımlı Tür sütunlarını güncelleştirme
Kullanıcı tanımlı tür sütunlarındaki değerlerin güncelleştirilmesi aşağıdaki yollardan biriyle gerçekleştirilebilir:
Kullanıcı tanımlı tür bu türden örtük veya açık dönüştürmeyi desteklediği sürece SQL Server sistem veri türünde bir değer sağlama. Aşağıdaki örnekte, kullanıcı tanımlı türdeki
Pointbir sütundaki bir değerin bir dizeden açıkça dönüştürülerek nasıl güncelleştirildiği gösterilmektedir.UPDATE Cities SET Location = CONVERT(Point, '12.3:46.2') WHERE Name = 'Anchorage';Güncelleştirmeyi gerçekleştirmek için kullanıcı tanımlı türde bir mutator olarak işaretlenmiş bir yöntemi çağırma. Aşağıdaki örnekte adlı
PointtürdeSetXYbir mutator yöntemi çağrılır. Bu, türün örneğinin durumunu güncelleştirir.UPDATE Cities SET Location.SetXY(23.5, 23.5) WHERE Name = 'Anchorage';Note
SQL Server, bir Transact-SQL null değerde bir mutator yöntemi çağrılırsa veya bir mutator yöntemi tarafından üretilen yeni bir değer null olduğunda bir hata döndürür.
Kullanıcı tanımlı türün kayıtlı özelliğinin veya genel veri üyesinin değerini değiştirme. Değeri sağlayan ifade, özelliğin türüne örtük olarak dönüştürülebilir olmalıdır. Aşağıdaki örnek, kullanıcı tanımlı türünün
XözelliğininPointdeğerini değiştirir.UPDATE Cities SET Location.X = 23.5 WHERE Name = 'Anchorage';Aynı kullanıcı tanımlı tür sütununun farklı özelliklerini değiştirmek için birden çok UPDATE deyimi gönderin veya türünde bir mutator yöntemi çağırın.
FILESTREAM verilerini güncelleştirme
UPDATE deyimini kullanarak FILESTREAM alanını null bir değere, boş değere veya nispeten küçük miktarda satır içi veriye güncelleştirebilirsiniz. Ancak, Win32 arabirimleri kullanılarak büyük miktarda veri daha verimli bir şekilde dosyaya aktarılır. FILESTREAM alanını güncelleştirdiğinizde, dosya sistemindeki temel BLOB verilerini değiştirirsiniz. FILESTREAM alanı NULL olarak ayarlandığında, alanla ilişkili BLOB verileri silinir. kullanamazsınız. WRITE(), FILESTREAM verisinde kısmi güncelleştirmeler gerçekleştirmek için. Daha fazla bilgi için bkz. FILESTREAM (SQL Server).
Hata yönetimi
Bir satırdaki güncelleştirme bir kısıtlamayı veya kuralı ihlal ederse, sütun için NULL ayarını ihlal ederse veya yeni değer uyumsuz bir veri türüyse, deyim iptal edilir, hata döndürülür ve hiçbir kayıt güncelleştirilmez.
bir UPDATE deyimi ifade değerlendirmesi sırasında aritmetik bir hatayla (taşma, sıfıra bölme veya etki alanı hatası) karşılaştığında güncelleştirme gerçekleştirilmez. Toplu işlemin geri kalanı yürütülmüyor ve bir hata iletisi döndürülür.
Kümelenmiş dizine katılan bir sütun veya sütun güncelleştirmesinin kümelenmiş dizinin boyutuna ve satırın 8.060 bayt'ı aşmasına neden olursa, güncelleştirme başarısız olur ve bir hata iletisi döndürülür.
Interoperability
UPDATE deyimlerine kullanıcı tanımlı işlevlerin gövdesinde yalnızca değiştirilen tablo bir tablo değişkeniyse izin verilir.
Bir tablonun UPDATE eylemleri üzerinde bir INSTEAD OF tetikleyici tanımlandığında, tetikleyici UPDATE deyimi yerine çalışır. SQL Server'ın önceki sürümleri yalnızca UPDATE ve diğer veri değişikliği deyimlerinde tanımlanan AFTER tetikleyicilerini destekler. FROM yan tümcesi, üzerinde tetikleyici tanımlanmış bir görünüme doğrudan veya dolaylı olarak başvuran bir INSTEAD OF UPDATE deyiminde belirtemez. TETIKLEYICILER YERİNE hakkında daha fazla bilgi için bkz. CREATE TRIGGER (Transact-SQL).
Şu anda FROM yan tümcesi Microsoft Fabric'teki Warehouse'daki UPDATE deyiminde belirtilemiyor. Tek tablolu UPDATE deyimleri desteklenir.
Sınırlamalar ve kısıtlamalar
FROM yan tümcesi, üzerinde tetikleyici tanımlanmış bir görünüme doğrudan veya dolaylı olarak başvuran bir INSTEAD OF UPDATE deyiminde belirtemez. Tetikleyiciler hakkında INSTEAD OF daha fazla bilgi için bkz. CREATE TRIGGER (Transact-SQL).
Bir update deyiminin hedefi ortak tablo ifadesi (CTE) olduğunda, deyimindeki CTE'ye yapılan tüm başvurular eşleşmelidir. Örneğin, CTE'ye FROM yan tümcesinde bir diğer ad atanırsa, diğer ad CTE'ye yapılan diğer tüm başvurular için kullanılmalıdır. CTE'nin nesne kimliği olmadığından, SQL Server'ın bir nesne ile diğer adı arasındaki örtük ilişkiyi tanımak için kullandığı kesin olmayan CTE başvuruları gereklidir. Bu ilişki olmadan sorgu planı beklenmeyen birleştirme davranışı ve istenmeyen sorgu sonuçları üretebilir. Aşağıdaki örneklerde, CTE güncelleştirme işleminin hedef nesnesi olduğunda doğru ve yanlış CTE belirtme yöntemleri gösterilmektedir.
USE tempdb;
GO
-- UPDATE statement with CTE references that are correctly matched.
DECLARE @x TABLE (ID INT, Value INT);
DECLARE @y TABLE (ID INT, Value INT);
INSERT @x VALUES (1, 10), (2, 20);
INSERT @y VALUES (1, 100),(2, 200);
WITH cte AS (SELECT * FROM @x)
UPDATE x -- cte is referenced by the alias.
SET Value = y.Value
FROM cte AS x -- cte is assigned an alias.
INNER JOIN @y AS y ON y.ID = x.ID;
SELECT * FROM @x;
GO
Sonuç kümesi aşağıdadır.
ID Value
------ -----
1 100
2 200
(2 row(s) affected)
Yanlış eşleştirilen CTE başvuruları içeren UPDATE deyimi.
USE tempdb;
GO
DECLARE @x TABLE (ID INT, Value INT);
DECLARE @y TABLE (ID INT, Value INT);
INSERT @x VALUES (1, 10), (2, 20);
INSERT @y VALUES (1, 100),(2, 200);
WITH cte AS (SELECT * FROM @x)
UPDATE cte -- cte isn't referenced by the alias.
SET Value = y.Value
FROM cte AS x -- cte is assigned an alias.
INNER JOIN @y AS y ON y.ID = x.ID;
SELECT * FROM @x;
GO
Sonuç kümesi aşağıdadır.
ID Value
------ -----
1 100
2 100
(2 row(s) affected)
Kilitleme davranışı
UPDATE deyimi, değiştirdiği tüm satırlarda özel (X) kilit alır ve işlem tamamlanana kadar bu kilitleri tutar. UPDATE deyiminin sorgu planına, değiştirilen satır sayısına ve işlemin yalıtım düzeyine bağlı olarak, kilitler satır düzeyi yerine sayfa düzeyinde veya tablo düzeyinde alınabilir. Bu üst düzey kilitleri önlemek için, binlerce veya daha fazla satırı etkileyen güncelleştirme deyimlerini toplu işlere bölmeyi ve tüm birleştirme ve filtre koşullarının dizinler tarafından desteklenmesinden emin olun. SQL Server'da mekanik kilitleme hakkında daha fazla bilgi için Veritabanı Altyapısı'nda Kilitleme makalesine bakın.
İyileştirilmiş kilitleme etkinleştirilirse, UPDATE için kilitleme davranışının bazı yönleri değişir. Örneğin, işlem tamamlanana kadar özel (X) kilitler tutulmaz. Daha fazla bilgi için bkz. İyileştirilmiş kilitleme.
Kayıt davranışı
UPDATE deyimi günlüğe kaydedilir; ancak, kullanarak büyük değer veri türlerinde kısmi güncelleştirmeler . WRITE yan tümcesi en az günlüğe kaydedilir. Daha fazla bilgi için önceki "Veri Türleri" bölümündeki "Büyük Değer Veri Türlerini Güncelleştirme" bölümüne bakın.
Security
Permissions
hedef tabloda UPDATE izinleri gereklidir.
SELECT UPDATE deyimi where yan tümcesi içeriyorsa veya SET yan tümcesindeki ifade tabloda bir sütun kullanıyorsa, güncelleştirilmekte olan tablo için de izinler gereklidir.
UPDATE izinleri varsayılan olarak sabit sunucu rolünün sysadmin üyeleri, db_owner ve db_datawriter sabit veritabanı rolleri ve tablo sahibidir. , sysadmin, ve rollerinin db_ownerüyeleri ve db_securityadmin tablo sahibi izinleri diğer kullanıcılara aktarabilir.
Examples
| Category | Öne çıkan söz dizimi öğeleri |
|---|---|
| Temel Söz Dizimi | UPDATE |
| Güncelleştirilen Satırları Sınırlama | BURADA * ÜST * ortak tablo ifadesi ile * BURADA AKIMIN |
| Sütun Değerlerini Ayarlama | hesaplanan değerler * bileşik işleçler * varsayılan değerler * alt sorgular |
| Standart Tablolar Dışında Hedef Nesneleri Belirtme | views * tablo değişkenleri * tablo diğer adları |
| Diğer Tablolardaki Verileri Temel Alarak Verileri Güncelleştirme | FROM |
| Uzak Tablodaki Satırları Güncelleştirme | bağlı sunucu * OPENQUERY * OPENDATASOURCE |
| Büyük Nesne Veri Türlerini Güncelleştirme | . YAZMA * OPENROWSET |
| Kullanıcı Tanımlı Türleri Güncelleştirme | kullanıcı tanımlı türler |
| İpuçları Kullanarak Sorgu İyileştiricisinin Varsayılan Davranışını Geçersiz Kılma | tablo ipuçları * sorgu ipuçları |
| UPDATE Deyiminin Sonuçlarını Yakalama | OUTPUT cümlesi |
| Update'i Diğer Deyimlerde Kullanma | Saklı Yordamlar * TRY... TUTMAK |
Temel söz dizimi
Bu bölümdeki örnekler, gerekli en düşük söz dizimini kullanarak UPDATE deyiminin temel işlevselliğini gösterir.
A. Basit bir UPDATE deyimi kullanma
Aşağıdaki örnek, tablodaki Person.Address tüm satırlar için tek bir sütunu güncelleştirir.
USE AdventureWorks2022;
GO
UPDATE Person.Address
SET ModifiedDate = GETDATE();
B. Birden çok sütunu güncelleştirme
Aşağıdaki örnek, tablodaki Bonustüm satırlar için , CommissionPctve SalesQuota sütunlarındaki SalesPerson değerleri güncelleştirir.
USE AdventureWorks2022;
GO
UPDATE Sales.SalesPerson
SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL;
GO
Güncelleştirilen Satırları Sınırlama
Bu bölümdeki örneklerde UPDATE deyiminden etkilenen satır sayısını sınırlamak için kullanabileceğiniz yollar gösterilmektedir.
C. WHERE yan tümcesini kullanma
Aşağıdaki örnek, güncelleştirilecek satırları belirtmek için WHERE yan tümcesini kullanır. deyimi, sütunda ColorProduction.Product mevcut 'Kırmızı' değerine sahip olan ve sütunda Color 'Road-250' ile başlayan bir değere sahip olan tüm satırlar için tablonun sütunundaki Name değeri güncelleştirir.
USE AdventureWorks2022;
GO
UPDATE Production.Product
SET Color = N'Metallic Red'
WHERE Name LIKE N'Road-250%' AND Color = N'Red';
GO
D. TOP yan tümcesini kullanma
Aşağıdaki örneklerde, BIR UPDATE deyiminde değiştirilen satır sayısını sınırlamak için TOP yan tümcesi kullanılır. UPDATE ile top (n) yan tümcesi kullanıldığında, güncelleştirme işlemi rastgele 'n' satır sayısı seçiminde gerçekleştirilir. Aşağıdaki örnek, tablodaki VacationHours 10 rastgele satır Employee için sütunu yüzde 25 oranında güncelleştirir.
USE AdventureWorks2022;
GO
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25 ;
GO
Güncelleştirmeleri anlamlı bir kronolojide uygulamak için TOP kullanmanız gerekiyorsa, subselect deyiminde ORDER BY ile birlikte TOP kullanmanız gerekir. Aşağıdaki örnek, 10 çalışanın tatil saatlerini en erken işe alma tarihleriyle güncelleştirir.
UPDATE HumanResources.Employee
SET VacationHours = VacationHours + 8
FROM (SELECT TOP 10 BusinessEntityID FROM HumanResources.Employee
ORDER BY HireDate ASC) AS th
WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID;
GO
E. WITH common_table_expression yan tümcesini kullanma
Aşağıdaki örnek, oluşturmak PerAssemblyQtyiçin doğrudan veya dolaylı olarak kullanılan tüm parçaların ve bileşenlerin değerini güncelleştirirProductAssemblyID 800. Ortak tablo ifadesi, doğrudan derlemek için kullanılan parçaların ve bu bileşenleri derlemek ProductAssemblyID 800 için kullanılan parçaların hiyerarşik bir listesini döndürür. Yalnızca ortak tablo ifadesi tarafından döndürülen satırlar değiştirilir.
USE AdventureWorks2022;
GO
WITH Parts(AssemblyID, ComponentID, PerAssemblyQty, EndDate, ComponentLevel) AS
(
SELECT b.ProductAssemblyID, b.ComponentID, b.PerAssemblyQty,
b.EndDate, 0 AS ComponentLevel
FROM Production.BillOfMaterials AS b
WHERE b.ProductAssemblyID = 800
AND b.EndDate IS NULL
UNION ALL
SELECT bom.ProductAssemblyID, bom.ComponentID, p.PerAssemblyQty,
bom.EndDate, ComponentLevel + 1
FROM Production.BillOfMaterials AS bom
INNER JOIN Parts AS p
ON bom.ProductAssemblyID = p.ComponentID
AND bom.EndDate IS NULL
)
UPDATE Production.BillOfMaterials
SET PerAssemblyQty = c.PerAssemblyQty * 2
FROM Production.BillOfMaterials AS c
JOIN Parts AS d ON c.ProductAssemblyID = d.AssemblyID
WHERE d.ComponentLevel = 0;
F. WHERE CURRENT OF yan tümcesini kullanma
Aşağıdaki örnek, yalnızca imlecin konumlandırıldığı satırı güncelleştirmek için WHERE CURRENT OF yan tümcesini kullanır. İmleç birleştirmeyi temel alırsa, yalnızca table_name UPDATE deyiminde belirtilenler değiştirilir. İmleçte yer alan diğer tablolar etkilenmez.
USE AdventureWorks2022;
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;
UPDATE HumanResources.EmployeePayHistory
SET PayFrequency = 2
WHERE CURRENT OF complex_cursor;
CLOSE complex_cursor;
DEALLOCATE complex_cursor;
GO
Sütun Değerlerini Ayarlama
Bu bölümdeki örneklerde hesaplanan değerler, alt sorgular ve DEFAULT değerleri kullanılarak sütunların güncelleştirilmesi gösterilmektedir.
G. Hesaplanan değer belirtme
Aşağıdaki örneklerde UPDATE deyiminde hesaplanan değerler kullanılır. Örnek, tablodaki ListPrice tüm satırlar için sütundaki değeri ikiye Product katlar.
USE AdventureWorks2022;
GO
UPDATE Production.Product
SET ListPrice = ListPrice * 2;
GO
H. Bileşik işleci belirtme
Aşağıdaki örnek, geçerli fiyatı alıp 10 ekleyerek tüm kırmızı bisikletlerin fiyatını artırmak için değişkenini @NewPrice kullanır.
USE AdventureWorks2022;
GO
DECLARE @NewPrice INT = 10;
UPDATE Production.Product
SET ListPrice += @NewPrice
WHERE Color = N'Red';
GO
Aşağıdaki örnek, verileri 10 ile 12 arasında olan satırlar ' - tool malfunction' için sütundaki Name mevcut değere eklemek ScrapReasonID için += bileşik işlecini kullanır.
USE AdventureWorks2022;
GO
UPDATE Production.ScrapReason
SET Name += ' - tool malfunction'
WHERE ScrapReasonID BETWEEN 10 and 12;
I. SET yan tümcesinde bir alt sorgu belirtme
Aşağıdaki örnek, sütunu güncelleştirmek için kullanılan değeri belirlemek için SET yan tümcesinde bir alt sorgu kullanır. Alt sorgu yalnızca bir skaler değer (satır başına tek bir değer) döndürmelidir. Örnek, tablodaki SalesYTDSalesPerson sütunu tabloya kaydedilen SalesOrderHeader en son satışları yansıtacak şekilde değiştirir. Alt sorgu, ekstredeki her satış temsilcisi için satışları UPDATE toplar.
USE AdventureWorks2022;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD +
(SELECT SUM(so.SubTotal)
FROM Sales.SalesOrderHeader AS so
WHERE so.OrderDate = (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader AS so2
WHERE so2.SalesPersonID = so.SalesPersonID)
AND Sales.SalesPerson.BusinessEntityID = so.SalesPersonID
GROUP BY so.SalesPersonID);
GO
J. VARSAYıLAN değerleri kullanarak satırları güncelleştirme
Aşağıdaki örnek, değerinden CostRate büyük CostRateolan tüm satırlar 20.00 için sütunu varsayılan değerine (0,00) ayarlar.
USE AdventureWorks2022;
GO
UPDATE Production.Location
SET CostRate = DEFAULT
WHERE CostRate > 20.00;
Standart Tablolar Dışında Hedef Nesneleri Belirtme
Bu bölümdeki örneklerde, bir görünüm, tablo diğer adı veya tablo değişkeni belirterek satırların nasıl güncelleştirildiği gösterilmektedir.
K. Hedef nesne olarak bir görünüm belirtme
Aşağıdaki örnek, hedef nesne olarak bir görünüm belirterek tablodaki satırları güncelleştirir. Görünüm tanımı birden çok tabloya başvurur, ancak UPDATE deyimi temel alınan tablolardan yalnızca birinden sütunlara başvuracağından başarılı olur. Her iki tablodan sütunlar belirtilirse UPDATE deyimi başarısız olur. Daha fazla bilgi için bkz . Görünüm Aracılığıyla Verileri Değiştirme.
USE AdventureWorks2022;
GO
UPDATE Person.vStateProvinceCountryRegion
SET CountryRegionName = 'United States of America'
WHERE CountryRegionName = 'United States';
L. Hedef nesne olarak bir tablo diğer adı belirtme
Aşağıdaki örnek, tablosundaki Production.ScrapReasonsatırları güncelleştirir. FROM yan tümcesinde atanan ScrapReason tablo diğer adı, UPDATE yan tümcesinde hedef nesne olarak belirtilir.
USE AdventureWorks2022;
GO
UPDATE sr
SET sr.Name += ' - tool malfunction'
FROM Production.ScrapReason AS sr
JOIN Production.WorkOrder AS wo
ON sr.ScrapReasonID = wo.ScrapReasonID
AND wo.ScrappedQty > 300;
M. Hedef nesne olarak tablo değişkeni belirtme
Aşağıdaki örnek bir tablo değişkenindeki satırları güncelleştirir.
USE AdventureWorks2022;
GO
-- Create the table variable.
DECLARE @MyTableVar TABLE (
EmpID INT NOT NULL,
NewVacationHours INT,
ModifiedDate DATETIME);
-- Populate the table variable with employee ID values from HumanResources.Employee.
INSERT INTO @MyTableVar (EmpID)
SELECT BusinessEntityID FROM HumanResources.Employee;
-- Update columns in the table variable.
UPDATE @MyTableVar
SET NewVacationHours = e.VacationHours + 20,
ModifiedDate = GETDATE()
FROM HumanResources.Employee AS e
WHERE e.BusinessEntityID = EmpID;
-- Display the results of the UPDATE statement.
SELECT EmpID, NewVacationHours, ModifiedDate FROM @MyTableVar
ORDER BY EmpID;
GO
Diğer Tablolardaki Verileri Temel Alarak Verileri Güncelleştirme
Bu bölümdeki örnekler, bir tablodaki satırları başka bir tablodaki bilgilere göre güncelleştirme yöntemlerini gösterir.
N. UPDATE deyimini başka bir tablodaki bilgilerle kullanma
Aşağıdaki örnek, tablodaki SalesYTDSalesPerson sütunu tabloya kaydedilen SalesOrderHeader en son satışları yansıtacak şekilde değiştirir.
USE AdventureWorks2022;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD + SubTotal
FROM Sales.SalesPerson AS sp
JOIN Sales.SalesOrderHeader AS so
ON sp.BusinessEntityID = so.SalesPersonID
AND so.OrderDate = (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader
WHERE SalesPersonID = sp.BusinessEntityID);
GO
Önceki örnekte, belirli bir tarihte belirtilen bir satış temsilcisi için yalnızca bir satışın kaydedildiğini ve güncelleştirmelerin güncel olduğu varsayılır. Belirtilen bir satış temsilcisi için aynı gün içinde birden fazla satış kaydedilebiliyorsa, gösterilen örnek düzgün çalışmıyor. Örnek hatasız çalışır, ancak o gün gerçekleşen satış sayısına bakılmaksızın her SalesYTD değer yalnızca bir satışla güncelleştirilir. Bunun nedeni, tek bir UPDATE deyiminin aynı satırı hiçbir zaman iki kez güncelleştirmeme olmasıdır.
Belirtilen bir satış temsilcisi için aynı gün birden fazla satışın gerçekleşebileceği durumda, aşağıdaki örnekte gösterildiği gibi, her bir satış elemanının tüm satışlarının deyim içinde UPDATE birlikte toplanması gerekir:
USE AdventureWorks2022;
GO
UPDATE Sales.SalesPerson
SET SalesYTD = SalesYTD +
(SELECT SUM(so.SubTotal)
FROM Sales.SalesOrderHeader AS so
WHERE so.OrderDate = (SELECT MAX(OrderDate)
FROM Sales.SalesOrderHeader AS so2
WHERE so2.SalesPersonID = so.SalesPersonID)
AND Sales.SalesPerson.BusinessEntityID = so.SalesPersonID
GROUP BY so.SalesPersonID);
GO
Uzak tablodaki satırları güncelleştirme
Bu bölümdeki örneklerde, uzak tabloya başvurmak için bağlı sunucu veya satır kümesi işlevi kullanarak uzak hedef tablodaki satırların nasıl güncelleştirildiği gösterilmektedir.
O. Bağlı sunucu kullanarak uzak tablodaki verileri güncelleştirme
Aşağıdaki örnek, uzak sunucudaki bir tabloyu güncelleştirir. Örnek, sp_addlinkedserverkullanarak uzak veri kaynağına bir bağlantı oluşturarak başlar. Bağlı sunucu adı, MyLinkedServerserver.catalog.schema.object biçimindeki dört parçalı nesne adının bir parçası olarak belirtilir. için @datasrcgeçerli bir sunucu adı belirtmeniz gerektiğini unutmayın.
USE master;
GO
-- Create a link to the remote data source.
-- Specify a valid server name for @datasrc as 'server_name' or 'server_nameinstance_name'.
EXEC sp_addlinkedserver @server = N'MyLinkedServer',
@srvproduct = N' ',
@provider = N'SQLNCLI10',
@datasrc = N'<server name>',
@catalog = N'AdventureWorks2022';
GO
USE AdventureWorks2022;
GO
-- Specify the remote data source using a four-part name
-- in the form linked_server.catalog.schema.object.
UPDATE MyLinkedServer.AdventureWorks2022.HumanResources.Department
SET GroupName = N'Public Relations'
WHERE DepartmentID = 4;
P. OPENQUERY işlevini kullanarak uzak tablodaki verileri güncelleştirme
Aşağıdaki örnek , OPENQUERY satır kümesi işlevini belirterek uzak tablodaki bir satırı güncelleştirir. Önceki örnekte oluşturulan bağlı sunucu adı bu örnekte kullanılmıştır.
UPDATE OPENQUERY (MyLinkedServer, 'SELECT GroupName FROM HumanResources.Department WHERE DepartmentID = 4')
SET GroupName = 'Sales and Marketing';
Q. OPENDATASOURCE işlevini kullanarak uzak tablodaki verileri güncelleştirme
Aşağıdaki örnek , OPENDATASOURCE satır kümesi işlevini belirterek uzak tablodaki bir satırı güncelleştirir. server_name veya server_name\instance_namebiçimini kullanarak veri kaynağı için geçerli bir sunucu adı belirtin. Geçici Dağıtılmış Sorgular için SQL Server örneğini yapılandırmanız gerekebilir. Daha fazla bilgi için bkz. geçici dağıtılmış sorgular Sunucu Yapılandırma Seçeneği.
UPDATE OPENDATASOURCE('SQLNCLI', 'Data Source=<server name>;Integrated Security=SSPI').AdventureWorks2022.HumanResources.Department
SET GroupName = 'Sales and Marketing' WHERE DepartmentID = 4;
Büyük Nesne veri türlerini güncelleştirme
Bu bölümdeki örneklerde, büyük nesne (LOB) veri türleriyle tanımlanan sütunlardaki değerleri güncelleştirme yöntemleri gösterilmektedir.
R. UPDATE'i ile kullanma. Nvarchar(max) sütunundaki verileri değiştirmek için YAZ
Aşağıdaki örnekte kullanılır. WRITE yan tümcesi, tablodaki DocumentSummarybir nvarchar(max) sütunundaki Production.Document kısmi değeri güncelleştirir.
components Sözcük, değiştirilen sözcükfeatures, var olan verilerde değiştirilecek sözcüğün başlangıç konumu (uzaklık) ve değiştirilecek karakter sayısı (uzunluk) belirtilerek sözcükle değiştirilir. Örnek ayrıca output yan tümcesini kullanarak sütunun önceki ve sonraki görüntülerini DocumentSummary tablo değişkenine @MyTableVar döndürür.
USE AdventureWorks2022;
GO
DECLARE @MyTableVar TABLE (
SummaryBefore NVARCHAR(max),
SummaryAfter NVARCHAR(max));
UPDATE Production.Document
SET DocumentSummary .WRITE (N'features',28,10)
OUTPUT deleted.DocumentSummary,
inserted.DocumentSummary
INTO @MyTableVar
WHERE Title = N'Front Reflector Bracket Installation';
SELECT SummaryBefore, SummaryAfter
FROM @MyTableVar;
GO
S. UPDATE'i ile kullanma. Nvarchar(max) sütununa veri eklemek ve kaldırmak için YAZ
Aşağıdaki örneklerde, şu anda NULL olarak ayarlanmış bir değere sahip nvarchar(max) sütunundaki veriler eklenip kaldırılmıştır. Çünkü . WRITE yan tümcesi NULL sütununu değiştirmek için kullanılamaz, sütun ilk olarak geçici verilerle doldurulur. Bu veriler daha sonra kullanılarak doğru verilerle değiştirilir. WRITE yan tümcesi. Ek örnekler, sütun değerinin sonuna veri ekler, sütundaki verileri kaldırır (keser) ve son olarak sütundan kısmi verileri kaldırır. SELECT deyimleri, her UPDATE deyimi tarafından oluşturulan veri değişikliğini görüntüler.
USE AdventureWorks2022;
GO
-- Replacing NULL value with temporary data.
UPDATE Production.Document
SET DocumentSummary = N'Replacing NULL value'
WHERE Title = N'Crank Arm and Tire Maintenance';
GO
SELECT DocumentSummary
FROM Production.Document
WHERE Title = N'Crank Arm and Tire Maintenance';
GO
-- Replacing temporary data with the correct data. Setting @Length to NULL
-- truncates all existing data from the @Offset position.
UPDATE Production.Document
SET DocumentSummary .WRITE(N'Carefully inspect and maintain the tires and crank arms.',0,NULL)
WHERE Title = N'Crank Arm and Tire Maintenance';
GO
SELECT DocumentSummary
FROM Production.Document
WHERE Title = N'Crank Arm and Tire Maintenance';
GO
-- Appending additional data to the end of the column by setting
-- @Offset to NULL.
UPDATE Production.Document
SET DocumentSummary .WRITE (N' Appending data to the end of the column.', NULL, 0)
WHERE Title = N'Crank Arm and Tire Maintenance';
GO
SELECT DocumentSummary
FROM Production.Document
WHERE Title = N'Crank Arm and Tire Maintenance';
GO
-- Removing all data from @Offset to the end of the existing value by
-- setting expression to NULL.
UPDATE Production.Document
SET DocumentSummary .WRITE (NULL, 56, 0)
WHERE Title = N'Crank Arm and Tire Maintenance';
GO
SELECT DocumentSummary
FROM Production.Document
WHERE Title = N'Crank Arm and Tire Maintenance';
GO
-- Removing partial data beginning at position 9 and ending at
-- position 21.
UPDATE Production.Document
SET DocumentSummary .WRITE ('',9, 12)
WHERE Title = N'Crank Arm and Tire Maintenance';
GO
SELECT DocumentSummary
FROM Production.Document
WHERE Title = N'Crank Arm and Tire Maintenance';
GO
T. Varbinary(max) sütununu değiştirmek için OPENROWSET ile UPDATE kullanma
Aşağıdaki örnek , varbinary(max) sütununda depolanan mevcut bir görüntüyü yeni bir görüntüyle değiştirir.
OPENROWSET işlevi, görüntüyü sütuna yüklemek için BULK seçeneğiyle birlikte kullanılır. Bu örnekte, belirtilen dosya yolunda adlı Tires.jpg bir dosyanın var olduğu varsayılır.
USE AdventureWorks2022;
GO
UPDATE Production.ProductPhoto
SET ThumbNailPhoto = (
SELECT *
FROM OPENROWSET(BULK 'c:Tires.jpg', SINGLE_BLOB) AS x )
WHERE ProductPhotoID = 1;
GO
U. FILESTREAM verilerini değiştirmek için UPDATE kullanma
Aşağıdaki örnek, dosya sistemi dosyasındaki verileri değiştirmek için UPDATE deyimini kullanır. Bir dosyaya büyük miktarda veri akışı yapmak için bu yöntemi önermeyiz. Uygun Win32 arabirimlerini kullanın. Aşağıdaki örnek, dosya kaydındaki tüm metinleri ile Xray 1değiştirir. Daha fazla bilgi için bkz. FILESTREAM (SQL Server).
UPDATE Archive.dbo.Records
SET [Chart] = CAST('Xray 1' as VARBINARY(max))
WHERE [SerialNumber] = 2;
Kullanıcı Tanımlı Türleri Güncelleştirme
Aşağıdaki örnekler CLR kullanıcı tanımlı tür (UDT) sütunlarındaki değerleri değiştirir. Üç yöntem gösterilmiştir. Kullanıcı tanımlı sütunlar hakkında daha fazla bilgi için bkz. CLR User-Defined Türleri.
V. Sistem veri türü kullanma
Kullanıcı tanımlı tür bu türden örtük veya açık dönüştürmeyi desteklediği sürece, SQL Server sistem veri türünde bir değer sağlayarak UDT'yi güncelleştirebilirsiniz. Aşağıdaki örnekte, kullanıcı tanımlı türdeki Pointbir sütundaki bir değerin bir dizeden açıkça dönüştürülerek nasıl güncelleştirildiği gösterilmektedir.
UPDATE dbo.Cities
SET Location = CONVERT(Point, '12.3:46.2')
WHERE Name = 'Anchorage';
W. Yöntem çağırma
GÜNCELLEŞTIRMEYI gerçekleştirmek için kullanıcı tanımlı türde bir mutator olarak işaretlenmiş bir yöntemi çağırarak UDT'yi güncelleştirebilirsiniz. Aşağıdaki örnekte adlı Pointtürde SetXY bir mutator yöntemi çağrılır. Bu, türün örneğinin durumunu güncelleştirir.
UPDATE dbo.Cities
SET Location.SetXY(23.5, 23.5)
WHERE Name = 'Anchorage';
X. Bir özelliğin veya veri üyesinin değerini değiştirme
Kayıtlı bir özelliğin veya kullanıcı tanımlı türün genel veri üyesinin değerini değiştirerek UDT'yi güncelleştirebilirsiniz. Değeri sağlayan ifade, özelliğin türüne örtük olarak dönüştürülebilir olmalıdır. Aşağıdaki örnek, kullanıcı tanımlı türünün Xözelliğinin Point değerini değiştirir.
UPDATE dbo.Cities
SET Location.X = 23.5
WHERE Name = 'Anchorage';
İpuçları Kullanarak Sorgu İyileştiricisinin Varsayılan Davranışını Geçersiz Kılma
Bu bölümdeki örneklerde UPDATE deyimi işlenirken sorgu iyileştiricisinin varsayılan davranışını geçici olarak geçersiz kılmak için tablo ve sorgu ipuçlarının nasıl kullanılacağı gösterilmektedir.
Caution
SQL Server sorgu iyileştiricisi genellikle sorgu için en iyi yürütme planını seçtiğinden, ipuçlarının yalnızca deneyimli geliştiriciler ve veritabanı yöneticileri tarafından son çare olarak kullanılmasını öneririz.
Y. Tablo ipucu belirtme
Aşağıdaki örnek TABLOCK tablo ipucunu belirtir. Bu ipucu, tabloda Production.Product paylaşılan bir kilidin alındığını ve UPDATE deyiminin sonuna kadar tutulduğunu belirtir.
USE AdventureWorks2022;
GO
UPDATE Production.Product
WITH (TABLOCK)
SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE 'BK-%';
GO
Z. Sorgu ipucu belirtme
Aşağıdaki örnek UPDATE deyimindeki sorgu ipucunuOPTIMIZE FOR (@variable) belirtir. Bu ipucu, sorgu derlendiğinde ve iyileştirildiğinde sorgu iyileştiriciye yerel değişken için belirli bir değeri kullanmasını bildirir. Değer, sorgu yürütme sırasında değil, yalnızca sorgu iyileştirmesi sırasında kullanılır.
USE AdventureWorks2022;
GO
CREATE PROCEDURE Production.uspProductUpdate
@Product NVARCHAR(25)
AS
SET NOCOUNT ON;
UPDATE Production.Product
SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE @Product
OPTION (OPTIMIZE FOR (@Product = 'BK-%') );
GO
-- Execute the stored procedure
EXEC Production.uspProductUpdate 'BK-%';
UPDATE deyiminin sonuçlarını yakalama
Bu bölümdeki örneklerde, BIR UPDATE deyiminden etkilenen her satırdan bilgi döndürmek için OUTPUT Yan Tümcesi'nin nasıl kullanılacağı gösterilmektedir. Bu sonuçlar, onay iletileri, arşivleme ve diğer uygulama gereksinimleri gibi durumlarda kullanılmak üzere işleme uygulamasına döndürülebilir.
ACAR. UPDATE'i OUTPUT yan tümcesiyle kullanma
Aşağıdaki örnek, tablodaki VacationHours sütunu Employee 10 VacationHours'tan az olan Çalışanlar için yüzde 25 oranında güncelleştirir ve sütundaki ModifiedDate değeri geçerli tarihe ayarlar.
OUTPUT yan tümcesi, sütundaki VacationHours deyimini ve sütundaki UPDATE güncelleştirilmiş değeri tablo değişkenine deleted.VacationHours uygulamadan inserted.VacationHours önce var olan değerini @MyTableVar döndürür.
içindeki değerleri ve tablodaki SELECT güncelleştirme işleminin @MyTableVar sonuçlarını döndüren iki Employee deyim izler. OUTPUT yan tümcesini kullanan diğer örnekler için bkz. OUTPUT Yan Tümcesi (Transact-SQL).
USE AdventureWorks2022;
GO
--Display the initial data of the table to be updated.
SELECT BusinessEntityID, VacationHours, ModifiedDate, HireDate
FROM HumanResources.Employee
WHERE VacationHours < 10
GO
DECLARE @MyTableVar TABLE (
EmpID int NOT NULL,
OldVacationHours smallint,
NewVacationHours smallint,
ModifiedDate datetime);
UPDATE HumanResources.Employee
SET VacationHours = VacationHours * 1.25,
ModifiedDate = GETDATE()
OUTPUT inserted.BusinessEntityID,
deleted.VacationHours,
inserted.VacationHours,
inserted.ModifiedDate
INTO @MyTableVar
WHERE VacationHours < 10
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours
, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO
--Display the result set of the table.
SELECT BusinessEntityID, VacationHours, ModifiedDate, HireDate
FROM HumanResources.Employee
WHERE VacationHours < 10
GO
Update'i diğer deyimlerde kullanma
Bu bölümdeki örneklerde, UPDATE'in diğer deyimlerde nasıl kullanılacağı gösterilmektedir.
AB. Saklı yordamda UPDATE kullanma
Aşağıdaki örnek, saklı yordamda UPDATE deyimini kullanır. Yordam, bir giriş parametresi ve @NewHoursbir çıkış parametresi @RowCountalır.
@NewHours parametre değeri, tablosundaki VacationHourssütunu HumanResources.Employee güncelleştirmek için UPDATE deyiminde kullanılır. Çıkış @RowCount parametresi, bir yerel değişkene etkilenen satır sayısını döndürmek için kullanılır. CASE ifadesi, IÇIN ayarlanan değeri koşullu olarak belirlemek için VacationHoursSET yan tümcesinde kullanılır. Çalışana saatlik ödeme yapıldığında (SalariedFlag = 0), VacationHours geçerli saat sayısına ve içinde @NewHoursbelirtilen değere ayarlanır; aksi takdirde, VacationHours içinde @NewHoursbelirtilen değere ayarlanır.
USE AdventureWorks2022;
GO
CREATE PROCEDURE HumanResources.Update_VacationHours
@NewHours SMALLINT
AS
SET NOCOUNT ON;
UPDATE HumanResources.Employee
SET VacationHours =
( CASE
WHEN SalariedFlag = 0 THEN VacationHours + @NewHours
ELSE @NewHours
END
)
WHERE CurrentFlag = 1;
GO
EXEC HumanResources.Update_VacationHours 40;
AC. TRY'de UPDATE kullanılıyor... CATCH Bloğu
Aşağıdaki örnek, BIR TRY içinde UPDATE deyimini kullanır... Güncelleştirme işlemi sırasında oluşabilecek yürütme hatalarını işlemek için CATCH bloğu.
USE AdventureWorks2022;
GO
BEGIN TRANSACTION;
BEGIN TRY
-- Intentionally generate a constraint violation error.
UPDATE HumanResources.Department
SET Name = N'MyNewName'
WHERE DepartmentID BETWEEN 1 AND 2;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
REKLAM. Basit bir UPDATE deyimi kullanma
Aşağıdaki örneklerde, güncelleştirilecek satırı (veya satırları) belirtmek için WHERE yan tümcesi kullanılmadığında tüm satırların nasıl etkilenebileceği gösterilmektedir.
Bu örnek, tablodaki EndDate tüm satırlar için ve CurrentFlag sütunlarındaki DimEmployee değerleri güncelleştirir.
-- Uses AdventureWorks
UPDATE DimEmployee
SET EndDate = '2010-12-31', CurrentFlag='False';
Hesaplanan değerleri update deyiminde de kullanabilirsiniz. Aşağıdaki örnek, tablodaki tüm satırlar için sütundaki ListPriceProduct değeri ikiye katlar.
-- Uses AdventureWorks
UPDATE DimEmployee
SET BaseRate = BaseRate * 2;
AE. UPDATE deyimini WHERE yan tümcesiyle kullanma
Aşağıdaki örnek, güncelleştirilecek satırları belirtmek için WHERE yan tümcesini kullanır.
-- Uses AdventureWorks
UPDATE DimEmployee
SET FirstName = 'Gail'
WHERE EmployeeKey = 500;
AF. UPDATE deyimini etiketle kullanma
Aşağıdaki örnekte UPDATE deyimi için LABEL kullanımı gösterilmektedir.
-- Uses AdventureWorks
UPDATE DimProduct
SET ProductSubcategoryKey = 2
WHERE ProductKey = 313
OPTION (LABEL = N'label1');
AG. UPDATE deyimini başka bir tablodaki bilgilerle kullanma
Bu örnek, yıla göre toplam satışları depolamak için bir tablo oluşturur. FactInternetSales tablosunda bir SELECT deyimi çalıştırarak 2004 yılının toplam satışlarını güncelleştirir.
-- Uses AdventureWorks
CREATE TABLE YearlyTotalSales (
YearlySalesAmount MONEY NOT NULL,
Year SMALLINT NOT NULL )
WITH ( DISTRIBUTION = REPLICATE );
INSERT INTO YearlyTotalSales VALUES (0, 2004);
INSERT INTO YearlyTotalSales VALUES (0, 2005);
INSERT INTO YearlyTotalSales VALUES (0, 2006);
UPDATE YearlyTotalSales
SET YearlySalesAmount=
(SELECT SUM(SalesAmount) FROM FactInternetSales WHERE OrderDateKey >=20040000 AND OrderDateKey < 20050000)
WHERE Year=2004;
SELECT * FROM YearlyTotalSales;
EY. Güncelleştirme deyimleri için ANSI katılımı
Bu örnekte, başka bir tabloya katılma sonucuna göre verilerin nasıl güncelleştirilecekleri gösterilmektedir.
CREATE TABLE dbo.Table1
(ColA INT NOT NULL, ColB DECIMAL(10,3) NOT NULL);
GO
CREATE TABLE dbo.Table2
(ColA INT NOT NULL, ColB DECIMAL(10,3) NOT NULL);
GO
INSERT INTO dbo.Table1 VALUES(1, 10.0);
INSERT INTO dbo.Table2 VALUES(1, 0.0);
GO
UPDATE dbo.Table2
SET dbo.Table2.ColB = dbo.Table2.ColB + dbo.Table1.ColB
FROM dbo.Table2
INNER JOIN dbo.Table1
ON (dbo.Table2.ColA = dbo.Table1.ColA);
GO
SELECT ColA, ColB
FROM dbo.Table2;
GO
Ayrıca Bkz.
TABLO OLUŞTUR (Transact-SQL)
TETİKLEYİCİ OLUŞTUR (Transact-SQL)
İmleçler (Transact-SQL)
SILME (Transact-SQL)
INSERT (Transact-SQL)
Metin ve Görüntü İşlevleri (Transact-SQL)
WITH common_table_expression (Transact-SQL)
FILESTREAM (SQL Server)
Harmanlama ve Unicode Desteği
Single-Byte ve Çok Baytlı Karakter Kümeleri