Güncelleştirme (Transact-sql)
Varolan veri bir tablo ya da görünümü değiştirir SQL Server 2012. Örnekler için bkz: örnekleri.
Transact-SQL Sözdizim Kuralları
Sözdizimi
[ 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}
Bağımsız değişkenler
İLE <common_table_expression>
Geçici adlı sonuç kümesi veya görünüm olarak da bilinen ortak tablo ifade (cte), update açıklaması kapsamında tanımlanan belirtir. cte sonuç kümesi, basit bir sorgudan elde edilen ve update deyimi tarafından başvurulmaktadır.Ortak tablo ifadeleri, select, INSERT, delete ve create VIEW deyimleri ile de kullanılabilir. Daha fazla bilgi için, bkz. Common_table_expression (Transact-sql).
TOP ( expression**)** [ PERCENT ]
Numarasını veya güncelleştirilecek satırları 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.
Sınırlayan parantez expressionilk INSERT, update ve delete deyimlerinde gereklidir. Daha fazla bilgi için, bkz. TOP (Transact-sql).
table_alias
Tablo veya görünüm içinden güncelleştirilecek satırları olan gösteren from yan tümcesinde belirtilen diğer adı.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ı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
Tablo veya görünüm içinden güncelleştirilecek satırları olan addır. Görünüm tarafından başvurulan table_or_view_namegüncelleştirilebilir olması gerekir ve bir temel tablo görünümünün from yan tümcesinde başvuru. 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>)
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).@table\_variable
Belirtir bir masa değişken tablo kaynağı olarak.AYARLA
Sütun veya güncelleştirilmesi için değişken adları listesini belirtir.column_name
Değiştirilecek veri içeren bir sütundur. column_namebulunması gerekir table_or view_name. Kimlik sütunları güncelleştirilemiyor.expression
Değişken, hazır bilgi değeri, ifade veya tek bir değer döndüren bir subselect deyimi (parantez ile) 's. Tarafından döndürülen değeri expressioniçinde varolan değerin yerini alır column_nameya @variable.[!NOT]
Unicode karakter veri türleri başvururken nchar, nvarchar, ve ntext, 'ifadesi' büyük harfle öneki 'n'. Eğer 'n' belirtilmemiş, SQL Serverkod sayfası için varsayılan harmanlama veritabanı veya sütun karşılık gelen dize dönüştürür. Bu kod sayfasında bulunmayan herhangi bir karakter kaybolur.
DEFAULT
Sütun için tanımlanan varsayılan değer sütununda varolan değerin yerini belirtir. Bu da sütunun varsayılan varsa ve boş değerlere izin vermek üzere tanımlanmış sütun null olarak değiştirmek için kullanılabilir.{ += | -= | *= | /= | %= | &= | ^= | |= }
Bileşik atama işleci:+= Ekleyin ve atama
-= Çıkarma ve atama
= Çarpın ve atama
/ Bölme ve ata =
% = Modül ve atama
&= Bitwise and ve ata
^ Bitsel xor = ve atama
| = Bitwise or ve ata
udt_column_name
Bir kullanıcı tanımlı türü sütun iş.property_name | field_name
Bir ortak özellik veya bir kullanıcı tanımlı türü ortak veri üyesi olduğunu.method_name**(**argument [ ,... n] )
Başvuramaz ortak mutator yöntemi olan udt_column_namebir veya daha fazla bağımsız değişken alır..WRITE (expression,@Offset,@Length**)**
Belirleyen bir değer bir bölümünü column_name değiştirilecek. expressiondeğiştirir @Lengthbirimleri başlayarak @Offset, column_name. Yalnızca sütun varchar(max), nvarchar(max), ya varbinary(max)Bu yan tümcesi ile belirtilebilir. column_nameBOŞ olamaz ve bir tablo adı veya tablo diğer adı ile nitelikli olamaz.expressionkopyalanan değeri column_name. expressiondeğerlendirmek gerekir ya da güçlü-e doğru için örtülü olarak döküm column_nametürü. Eğer expressionnull olarak ayarlanır @Lengthsayılır ve değer column_namekesilir, belirtilen @Offset.
@Offset başlangıç noktası değeri column_nameen expressionyazılır. @Offsetsıfır tabanlı sıralı konumunu ise, bigint, negatif bir sayı olamaz. Eğer @OffsetNULL, güncelleştirme işlemi ekler expressionmevcut sonunda column_namedeğeri ve @Lengthgöz ardı edilir. @ Ofset uzunluğundan büyükse column_namedeğeri Veritabanı Altyapısıhata veriyor. Eğer @Offsetartı @Lengthtemel alan değeri sütun sonunu aşıyor, silinmesine kadar son karakter değeri ortaya. Eğer @Offsetlen artı (expression) temel daha büyük boyut ilan, bir hata ortaya çıkar.
@Lengthuzunluk sütununda, başlangıç bölümünün @Offset, ki yerini expression. @Lengthise bigintve negatif bir sayı olamaz. Eğer @LengthNULL, güncelleştirme işlemi tüm verileri kaldırır @Offsetsonuna kadar column_namedeğer.
Daha fazla bilgi için, Yorumlar'a bakın.
**@**variable
Tarafından döndürülen değere ayarlanır bildirilen bir değişken expression.set **@**variable = column= expressiondeğişken sütun olarak aynı değeri ayarlar. Bu KÜMESİNDEN farklıdır **@**variable = column, column= expression, hangi değişken sütun pre-update değerine ayarlar.
<OUTPUT_Clause>
Döner, veri veya güncelleştirme işleminin bir parçası olarak temel ifadeler güncelleştirildi. output yan tümcesi, hedef uzak tablo veya görünümlerin herhangi bir dml deyimleri desteklenmez. Daha fazla bilgi için, bkz. output Yantümcesi (Transact-sql).DAN <table_source>
Bir tablo, görünüm veya türetilmiş bir tablo kaynak güncelleştirme işlemi için ölçüt sağlamak için kullanıldığını belirtir. Daha fazla bilgi için, bkz. FROM (Transact-sql).Güncelleştirilen nesnenin nesne from yan tümcesinde ile aynıdır ve sadece bir from yan tümcesinde nesne referansı ise, bir nesnenin diğer olabilir veya belirtilmemiş olabilir. Güncelleştirilen nesnenin birden fazla from yan tümcesi, bir ve yalnızca bir kez görünüyorsa, nesneye bir tablo diğer adı belirtmemelisiniz. from yan tümcesinde nesne tüm başvuruları, bir nesnenin diğer adını içermelidir.
update INSTEAD OF tetikleyici görünümüyle bir from yan tümcesi içeren bir güncelleştirme hedefi olamaz.
[!NOT]
FROM yan tümcesinde OPENDATASOURCE, OPENQUERY veya OPENROWSET deyimine yapılan tüm çağrılar, ayrı ayrı ve her iki çağrıya da aynı değişkenler sağlansa da güncelleştirmenin hedefi olarak bu işlevlere yapılan tüm çağrılardan bağımsız olarak değerlendirilir. Özellikle, bu çağrılardan birinin sonuçlarına uygulanan filtreleme veya birleştirme koşullarının diğeri üzerinde hiçbir etkisi yoktur.
BURADA
Güncelleştirilen satırları sınırla koşulları belirtir. Güncelleştirmenin hangi formu where yan tümcesinde kullanılan temel iki biçimi vardır:Aranan güncelleştirmeleri silmek için satır nitelemek için bir arama koşulu belirtin.
Güncelleştirmeleri kullanımı bir imleç belirtmek için current of yan tümcesi konumlandırılmış. Güncelleştirme işlemi, geçerli imleç konumu oluşur.
<search_condition>
Güncelleştirilecek satırları yerine getirilmesi koşulu belirtir. Arama koşulu da bunun üzerine birleştirme temel koşulu olabilir. Bir arama koşulunda dahil edilebilir yüklemler sayısına bir sınır yoktur. Yüklemler ve arama koşulları hakkında daha fazla bilgi için bkz: Arama koşulu (Transact-sql).MEVCUT
Güncelleştirme geçerli belirtilen imleç konumu gerçekleştirilen belirtir.where current of yan tümcesi kullanarak bir konumlandırılmış güncelleştirme geçerli imleç konumu tek satır güncelleştirir. Bu-ebilmek var olmak daha where kullandığı aranan bir güncelleştirme daha doğru <search_condition> yan güncelleştirilecek satırları hak kazanmak için. Arama koşulu tek bir satırı benzersiz şekilde tanımlamaz zaman aranan bir güncelleştirme birden çok satır değiştirir.
KÜRESEL
Belirleyen cursor_namegenel imleci için başvuruyor.cursor_name
Açık imleç GETIRME yapılması gereken addı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şeninin adıdır. cursor_variable_namegüncelleştirmelere olanak veren bir imleç başvuru gerekir.OPTION ( <query_hint> [ ,... n ] )
Doktoru ipuçları şeklini özelleştirmek için kullanıldığını belirtir Veritabanı Altyapısıdeyimi işler. Daha fazla bilgi için, bkz. Sorgu ipuçları (Transact-sql).
En İyi Yöntemler
@@ rowcount istemci uygulamasına eklenen satır sayısı dönmek işlevi. Daha fazla bilgi için, bkz. @@ rowcount (Transact-sql).
Değişken adları update deyimleri etkilenen eski ve yeni değerleri göstermek için kullanılabilir, ancak yalnızca tek bir kayıt update deyimi etkiler bu kullanılmalıdır. update deyimi her bir kayıt için eski ve yeni değerleri döndürmek için birden çok kaydı etkiliyorsa kullanmak output yan tümcesi.
from yan tümcesi belirtirken güncelleştirme işlemi için ölçüt sağlamak için dikkatli olun. Deyim böyle bir şekilde tek bir değer update deyimi deterministic değil yani, güncelleştirilen her sütun örneği için kullanılabilir belirtilmemiş bir from yan tümcesi içeriyorsa bir update deyimi sonuçları tanımsızdır. Örneğin, aşağıdaki komut update deyimi içinde hem satır içinde Table1from yan tümcesinde update deyimi; nitelikleri karşılamak ama o da gelen satır tanımsız Table1satır güncelleştirmek için kullanılırTable2.
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL
DROP TABLE dbo.Table1;
GO
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT 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;
from ve where current of yan tümceleri birleştirildiğinde aynı sorun ortaya çıkabilir. Aşağıdaki örnekte, hem de satır içinde Table2nitelikleri karşılamak FROMyan UPDATEdeyimi. O da gelen satır tanımsız Table2satır güncelleştirmek için kullanılacak Table1.
USE AdventureWorks2012;
GO
IF OBJECT_ID ('dbo.Table1', 'U') IS NOT NULL
DROP TABLE dbo.Table1;
GO
IF OBJECT_ID ('dbo.Table2', 'U') IS NOT 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 deyimi hedef tabloya uygulanan READUNCOMMITTED ve nolock ipuçlarını from yan tümcesinde kullanımını bir gelecek sürümünde kaldırılacak dil desteği SQL Server. Bu bağlamda yeni geliştirme çalışmalarında bu ipuçları kullanmaktan kaçının ve şu anda bunları kullanan uygulamaları değiştirmek planlıyoruz.
Veri Türleri
Tüm charve ncharsütun tanımlanmış uzunluğu için sağ dolgulu.
ANSI_PADDING off için ayarlanmış ise, tüm boşluklar içine eklenen verileri kaldırılır varcharve nvarcharsütunları hariç, yalnızca boşluk içeren dizeleri. Bu dizelerin boş bir dizeye dönüştürülür. ANSI_PADDING on olarak ayarlanmışsa, boşluk eklenir. Otomatik olarak SQL Server için ole db sağlayıcısı ve Microsoft SQL Server odbc sürücüsü ANSI_PADDING on her bağlantı için ayarlanmış. Bu işlem, odbc veri kaynakları veya bağlantı özniteliklerini ayarlama veya özellikleri de yapılandırılabilir. Daha fazla bilgi için, bkz. set ANSI_PADDING (Transact-sql).
Metin, ntext ve resim sütunlar güncelleştiriliyor
Değiştirme bir text, ntext, ya imageupdate sütun sütunu başlatır, geçerli metin imleci atar ve sütun null ile güncellenmektedir sürece en az bir veri sayfası ayırır.
Değiştirmek veya büyük bloklar halinde değiştirmek için text, ntext, ya imagekullanım verileri WRITETEXT veya updatetext deyimi yerine.
update deyimi birden çok satırı hem kümeleme anahtarı ve bir veya daha fazla güncelleştirme sırasında değişebilir, text, ntext, ya imagesütunlar, bu sütunlarda kısmi güncelleştirme değerlerin tam yerine yürütüldüğünde.
Önemli |
---|
ntext, text, Ve imageveri türleri, gelecekteki bir sürümüne kaldırılacak Microsoft SQL Server. Yeni geliştirme işlerinde bu veri türlerini kullanmaktan kaçının ve bunları kullanmakta olan uygulamaları değiştirmek için plan yapın. Kullanım nvarchar(max), varchar(max), ve varbinary(max) onun yerine. |
Büyük değer veri türleri güncelleştiriliyor
Kullanım .Yazmak (expression, @Offset**,**@Length), kısmi veya tam bir güncelleştirme gerçekleştirmek için yan varchar(max), nvarchar(max), ve varbinary(max)veri türlerini. Örneğin, kısmi bir güncelleme bir varchar(max)sütun bir tam güncelleştirme silin veya sütundaki tüm verilerde değişiklik ise yalnızca ilk 200 karakter sütunu, değiştirmek veya silmek. **.**Veritabanı kurtarma modeli toplu ya da basit olarak ayarlanırsa Ekle veya yeni veri eklemek güncelleştirmeleri minimal günlüğe yazma. Varolan değerleri güncelleştirildiğinde Minimal günlüğü kullanılır. Daha fazla bilgi için, bkz. İşlem günlüğü (SQL Server).
Veritabanı Altyapısıupdate deyimi ya da bu eylemleri neden olduğunda, tam bir güncelleme kısmi güncelleştirme dönüştürür:
Bölümlenmiş görünümün veya tablo anahtar sütunu değiştirir.
Birden fazla satır değiştirir ve de benzer bir Kümelenmiş dizin anahtarı nonconstant bir değerle güncelleştirir.
Sen cant'kullanma **.**Boş sütunu güncelleştirmek veya değerini ayarlamak için yazma yan column_name NULL.
@Offsetve @Lengthbayt için belirtilen varbinaryve varcharveri türleri ve karakter nvarcharveri türü. Çift bayt karakter kümesi (dbcs) alfabe için uygun uzaklıklar hesaplanır.
En iyi performans için veri eklendiğinde veya 8040 bayt katları olan öbek boyutlarda güncelleştirilmiş öneririz.
Eğer sütun değiştiren **.**Yan tümcesi output yan tümcesi içinde tam sütun değeri, ya da başvurulan yazmak önce görüntü **silindi.**column_name ya da sonra görüntü **eklenmiş.**column_name, tablo değişkeni içinde belirtilen sütun döndürülür. İzleyen g bkz.
Aynı işlevselliği elde etmek için ., Diğer karakter veya ikili veri türleri ile yazmak için kullanmak MALZEME (Transact-sql).
Kullanıcı tanımlı tür sütunlar güncelleştiriliyor
Kullanıcı tanımlı türü sütunlardaki değerleri güncelleştirme aşağıdaki yollardan biriyle gerçekleştirilebilir:
Bir değer sağlayan bir SQL Serversistem veri türü, örtülü veya açık dönüştürme türü kullanıcı tanımlı türü desteklediği sürece. Aşağıdaki örnek nasıl bir kullanıcı tanımlı türü sütunundaki bir değeri gösterir Point, açıkça bir dizeden dönüştürerek.
UPDATE Cities SET Location = CONVERT(Point, '12.3:46.2') WHERE Name = 'Anchorage'; UPDATE Cities SET Location = CONVERT(Point, '12.3:46.2') WHERE Name = 'Anchorage';
Yöntem çağırma, güncelleştirmeyi gerçekleştirmek için kullanıcı tanımlı türü bir mutator işaretlenmiş. Aşağıdaki örnek türü mutator yöntemi çağırır Pointadlı SetXY. Bu türü örneği durumunu güncelleştirir.
UPDATE Cities SET Location.SetXY(23.5, 23.5) WHERE Name = 'Anchorage'; UPDATE Cities SET Location.SetXY(23.5, 23.5) WHERE Name = 'Anchorage';
[!NOT]
SQL ServerTarih mutator yöntemi çağrılan bir hata döndürür bir Transact-SQLnull değeri veya yeni bir değer tarafından üretilen mutator yöntemi null olur.
Kayıtlı özelliği veya ortak veri üyesi kullanıcı tanımlı türü değeri değiştirme. Değer sağlayarak ifade özellik türüne örtük olarak dönüştürülebilir olmalıdır. Aşağıdaki örnek özelliğinin değerini değiştirir Xkullanıcı tanımlı türü Point.
UPDATE Cities SET Location.X = 23.5 WHERE Name = 'Anchorage'; UPDATE Cities SET Location.X = 23.5 WHERE Name = 'Anchorage';
Aynı kullanıcı tanımlı türü sütun farklı özelliklerini değiştirmek, birden fazla update deyimleri sorun veya türü mutator yöntemi çağırmak için.
FILESTREAM veri güncelleştirme
update deyimi, bir FILESTREAM alanı boş değer, boş değer veya satır içi veri nispeten küçük bir miktarını güncelleştirmek için kullanabilirsiniz. Ancak, büyük miktarda veri daha verimli bir dosyaya Win32 arabirimleri kullanılarak akışla gönderilir. FILESTREAM alanı güncelleştirdiğinizde, dosya sisteminde temel blob verileri değiştirin. FILESTREAM alan null olarak ayarlanır alanıyla ilişkili blob verileri silinir. Sen cant'kullanma .Kısmi güncelleştirmeleri FILESTREAM veri gerçekleştirmek için WRITE(),. Daha fazla bilgi için, bkz. FILESTREAM (SQL Server).
Hata işleme
BOŞ bir satır güncelleştirme bir kısıtlama veya kuralı ihlal ederse, ihlal ayardır sütun ya da yeni bir değer bir uyumsuz veri türü, deyimi iptal edilir, bir hata döndürülür ve kayıt güncelleştirilir.
Bir update deyimi ifade değerlendirme sırasında (taşma, sıfır ya da bir etki alanı hata bölme) aritmetik hata karşılaştığında, güncelleştirme gerçekleştirilir. Toplu işin geri kalanını yürütüldü ve bir hata iletisi döndürülür.
Kümelenmiş dizin ve satır 8,060 bayt aşan bir sütun veya sütunları Kümelenmiş bir dizin içinde katılan bir güncelleştirmeye neden oluyorsa, güncelleştirme başarısız olur ve bir hata iletisi döndürülür.
Birlikte Çalışabilirlik
update deyimleri, yalnızca bir tablo değişkeni değiştirilmesini tablo ise, kullanıcı tanımlı işlevler gövdesinde izin verilir.
Tetikleyici ıNSTEAD of tetikleyici tablo karşı update eylemleri tanımlandığında, update deyimi yerine çalışıyor. Önceki SQL Serverupdate ve diğer veri değişikliği deyimleri üzerinde tanımlı Tetikleyiciler sonra sadece destek. from yan tümcesi içinde bir update deyimi, bir görünümü üzerinde tanımlı bir INSTEAD of tetikleyicisi ile doğrudan veya dolaylı olarak başvuran belirtilemez. Hakkında daha fazla bilgi için ıNSTEAD OF Tetikleyicileri, bakın CREATE TRIGGER (Transact-SQL).
Sınırlamalar ve Kısıtlamalar
from yan tümcesi içinde bir update deyimi, bir INSTEAD of tetikleyici tanımlanmış olan görünüm doğrudan veya dolaylı olarak başvuran belirtilemez. Hakkında daha fazla bilgi için ıNSTEAD OF Tetikleyicileri, bakın CREATE TRIGGER (Transact-SQL).
Ortak bir tablo ifade (cte) bir update deyimi hedef olduğunda, tüm başvuruları deyimi cte eşleşmesi gerekir. cte bir takma ad from yan tümcesinde atanırsa, örneğin, diğer tüm diğer başvurular için cte kullanılması gerekir. Belirsizliği cte başvurularını gerekli bir cte bir nesne kimliği olmadığı için hangi SQL Serverbir nesneyi ve onun takma dolaylı ilişkisi tanımak için kullanır. Bu ilişki sorgu planı beklenmeyen birleştirme davranışı ve istenmeyen sorgu sonuçları üretebilir. Aşağıdaki örnekler cte hedef nesne güncelleştirme işlemi olduğunda bir cte belirterek doğru ve yanlış yöntemleri göstermektedir.
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 buradadır.
ID Value
------ -----
1 100
2 200
(2 row(s) affected)
-- UPDATE statement with CTE references that are incorrectly matched.
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 is not 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 buradadır.
ID Value
------ -----
1 100
2 100
(2 row(s) affected)
Kilitleme davranışı
Her zaman bir update deyimi, bir özel (x) kilidi değiştirir ve hareket tamamlanıncaya kadar bu kilit tutan tablo satın aldı. Özel bir kilit ile diğer hareketleri verileri değiştirebilirsiniz. Başka bir kilitleme yöntemini belirterek update 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).
Günlüğe Yazma Davranışı
update deyimi kaydedilir; Ancak, büyük bir değer veri türleri kullanılarak kısmi güncelleştirmeler **.**Yan tümcesi en az günlüğe yazma. Daha fazla bilgi için bkz: "Büyük değer veri türleri güncelleştirmek" önceki bölümde "Veri türü".
Güvenlik
İzinler
Hedef Tablo güncelleştirme izinleri gerekir. select izinleri de update deyimi where yan tümcesi içeriyorsa ya da eğer güncelleştirilmekte tablo için gerekli expressionset yan tümcesi bir sütun tabloda kullanır.
Üyeleri için varsayılan izinleri GÜNCELLEŞTİRMEK sysadmin sabit sunucu rolü, db_owner ve db_datawriter sabit veritabanı rolleri ve tablo sahibi. Üyeleri sysadmin, db_owner, ve db_securityadmin rol sahibi transfer ve izinleri diğer kullanıcılara.
Örnekler
Kategori |
Seçme sözdizimi öğeleri |
---|---|
Temel sözdizimi |
GÜNCELLEŞTİRME |
Satırları o güncelleştirilir sınırlama |
Burada top • ortak tablo ifade • where current of |
Sütun değerlerini ayarlama |
Hesaplanan değerler • bileşik işleçleri • varsayılan değerleri • alt sorgular |
Hedef nesne standart tablolar dışındaki belirtme |
• Tablo değişkenlerini • tablo diğer adları görünümler |
Diğer tablolardaki verileri temel alan veri güncelleştirme |
Kaynak |
Bir uzak tablo güncelleştiriliyor |
bağlantılı sunucu • openquery opendatasource |
Büyük nesne veri türleri güncelleştiriliyor |
.YAZMA • OPENROWSET |
Kullanıcı tanımlı türler güncelleştiriliyor |
kullanıcı tanımlı türler |
Ipuçlarını kullanarak sorgu en iyi duruma getiricisi varsayılan davranışını geçersiz kılma |
Tablo ipuçları • sorgu ipuçları |
update deyimi sonuçları yakalama |
output yan tümcesi |
update kullanarak diğer deyimleri |
Saklı yordamlar • try…YAKALAMAK |
Temel sözdizimi
Bu bölümdeki örnekler, en az gerekli sözdizimini kullanarak güncelleştirme deyimini temel işlevselliğini göstermektedir.
A.Bir update deyimi kullanarak
Aşağıdaki örnek, tüm satırlar tek sütun güncelleştirir Person.Addresstablosu.
USE AdventureWorks2012;
GO
UPDATE Person.Address
SET ModifiedDate = GETDATE();
B.Birden çok sütun güncelleştirme
Aşağıdaki örnek, değerleri güncelleştirir Bonus, CommissionPct, ve SalesQuotatüm satırlar için sütun SalesPersontablosu.
USE AdventureWorks2012;
GO
UPDATE Sales.SalesPerson
SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL;
GO
Satırları o güncelleştirilir sınırlama
Bu bölümdeki örnekler update deyimi tarafından etkilenen satırların sayısını sınırlamak için kullanabileceğiniz yolları göstermektedir.
A.where yan tümcesi kullanarak
Aşağıdaki örnek, güncelleştirilecek satırları belirtmek için where yan tümcesini kullanır. Deyimin değerini güncelleştirir Colorsütununda Production.Producttablo için tüm satırların, 'Red' Varolan bir değeri var de Colorsütun ve bir değere sahip Name'Road-250' başlatan sütun.
USE AdventureWorks2012;
GO
UPDATE Production.Product
SET Color = N'Metallic Red'
WHERE Name LIKE N'Road-250%' AND Color = N'Red';
GO
B.ÜZERINDEN yan tümcesi kullanarak
Aşağıdaki örnekler, bir update deyimi içinde değiştirilen satırların sayısını sınırlamak için top yan tümcesi kullanın. Ne zaman bir üst (n) yan tümcesi güncelleme ile kullanıldığında, güncelleştirme işlemi üzerinde rastgele bir seçim yapılır 'n' satır sayısı. Aşağıdaki örnek güncelleştirmeleri VacationHours25 yüzde 10 rastgele satır için sütun Employeetablosu.
USE AdventureWorks2012;
GO
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25 ;
GO
Anlamlı bir kronolojisi güncelleştirmeleri uygulamak için en iyi kullanmanız gerekiyorsa, subselect deyimi içinde top sipariş ile birlikte kullanmanız gerekir. Aşağıdaki örnek, en erken işe alınma tarihleri için tatil saatleri 10 çalışanların 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
C.Common_table_expression yan kullanma
Aşağıdaki örnek güncelleştirmeleri PerAssemnblyQtytüm bölümleri ve doğrudan kullanılan bileşenleri ya da dolaylı olarak oluşturmak için değeri ProductAssemblyID 800. Ortak tablo ifade doğrudan oluşturmak için kullanılan bölümleri hiyerarşik bir listesini döndürür ProductAssemblyID 800ve bu bileşenleri kurmak vb. için kullanılan parçalar. Ortak tablo ifade tarafından döndürülen satırları değiştirilir.
USE AdventureWorks2012;
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;
D.where current of yan tümcesi kullanarak
Aşağıdaki örnekte where current of yan tümcesi yalnızca üzerinde imleç konumlandırılmış satırı güncelleştirmek için kullanır. Bir imleç birleştirme üzerinde yalnızca temel ne zaman table_nameGÜNCELLEŞTİRMEDE belirtilen beyanı değişiklik. İmlecin katılan diğer tablolar etkilenmez.
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;
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 örnekler, hesaplanan değerleri, alt sorgular ve varsayılan değerleri kullanarak güncelleştirme sütunları göstermektedir.
A.Hesaplanan değeri belirtme
Aşağıdaki örnekler bir update deyimi içinde hesaplanmış değerleri kullanır. Örnek değeri iki katına ListPricetüm satırlar için sütun Producttablosu.
USE AdventureWorks2012 ;
GO
UPDATE Production.Product
SET ListPrice = ListPrice * 2;
GO
B.Bileşik bir operatör belirtme
Aşağıdaki örnek, değişken kullanır @NewPriceCari fiyat almak ve bunu 10 ekleyerek tüm kırmızı bisiklet fiyat artırmak için
USE AdventureWorks2012;
GO
DECLARE @NewPrice int = 10;
UPDATE Production.Product
SET ListPrice += @NewPrice
WHERE Color = N'Red';
GO
Aşağıdaki örnek, veri eklemek bileşik işleci olan += kullanır ' - tool malfunction'sütununda varolan değeri Namesatırları için bir ScrapReasonID10 ile 12 arasında.
USE AdventureWorks2012;
GO
UPDATE Production.ScrapReason
SET Name += ' - tool malfunction'
WHERE ScrapReasonID BETWEEN 10 and 12;
C.set yan tümcesi alt sorgu belirtme
Aşağıdaki örnek sorgu set yan tümcesinde sütunu güncelleştirmek için kullanılan değeri belirlemek için kullanır. Alt sorgunun yalnızca skalar bir değer (diğer bir deyişle, tek bir değer her satır) döndürmesi gerekir. Örnek SalesYTDsütununda SalesPersonkaydedilen en son satış yansıtacak şekilde tablo SalesOrderHeadertablosu. Alt sorgunun her satış elemanı için satışları toplar UPDATEdeyimi.
USE AdventureWorks2012;
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
D.Varsayılan değerleri kullanarak satır güncelleştirme
Aşağıdaki örnek kümeleri CostRatesütun için varsayılan değer (0,00) tüm satırları olan bir CostRatedeğeri 20.00.
USE AdventureWorks2012;
GO
UPDATE Production.Location
SET CostRate = DEFAULT
WHERE CostRate > 20.00;
Hedef nesne standart tablolar dışındaki belirtme
Bu bölümdeki örnekler, görünüm, tablo diğer adı veya tablo değişkeni belirterek satır güncelleştirme gösterilmektedir.
A.Hedef nesnenin görünümü belirtme
Aşağıdaki örnek, hedef nesnenin görünüm belirterek bir tablo güncelleştirir. Görünüm tanımını birden fazla tabloya başvuran, ancak başarılı update deyiminin sütunlar yalnızca temel tabloların birinden başvurduğu çünkü. Her iki tablodan sütun belirtilen update deyimi başarısız. Daha fazla bilgi için, bkz. Bir görünüm üzerinden veri değiştirme.
USE AdventureWorks2012;
GO
UPDATE Person.vStateProvinceCountryRegion
SET CountryRegionName = 'United States of America'
WHERE CountryRegionName = 'United States';
B.Hedef nesne olarak bir tablo diğer adı belirtme
Izleyin örnek tablosundaki satır güncelleştirir Production.ScrapReason. Atanan tablo diğer adı ScrapReasonKimden yan update yan tümcesi hedef nesne olarak belirtilen.
USE AdventureWorks2012;
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;
C.Hedef nesne olarak bir tablo değişkeni belirtme
Aşağıdaki örnek, satır içinde bir tablo değişkeni güncelleştirir.
USE AdventureWorks2012;
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 alan veri güncelleştirme
Bu bölümdeki örnekler, bir tablodan başka bir tablodaki bilgilere dayanarak güncelleştirme yöntemleri göstermektedir.
A.Bilgileri başka bir tablodan update deyimi kullanarak
Aşağıdaki örnek SalesYTDsütununda SalesPersonkaydedilen en son satış yansıtacak şekilde tablo SalesOrderHeadertablosu.
USE AdventureWorks2012;
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 Tarih ve güncelleştirmelerin belirli bir satış temsilcisi için geçerli bu yalnızca bir satış kaydedilir varsayar. Belirli bir satış temsilcisi için birden fazla satış aynı gün kaydedilebilir, gösterilen örnek düzgün çalışmıyor. Örnek hata olmadan, ama her çalışan SalesYTD değeri ne olursa olsun kaç satış oluştu aslında o gün yalnızca bir satış ile güncelleştirilir. Bunun nedeni, tek bir update deyimi asla iki defa aynı satırı güncelleştirir.
Hangi birden fazla satış için belirli bir satış temsilcisi aynı gün, ortaya çıkabilecek her satış elemanı tüm satış gerekir toplanan birlikte içinde durum UPDATEdeyimi aşağıdaki örnekte gösterildiği gibi:
USE AdventureWorks2012;
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
Bir uzak tablo güncelleştiriliyor
Bu bölümdeki örnekler göstermek kullanarak bir uzak hedef tablodaki satırların nasıl bir bağlantılı sunucu ya da bir satır kümesi işlevi uzak tablo başvurmak.
A.Bağlantılı bir sunucu kullanarak uzak bir tabloya veri güncelleştirme
Aşağıdaki örnek, bir uzak sunucuda bir tablo güncelleştirir. Uzak veri kaynağına bir bağlantı kullanarak oluşturarak örnek başlıyor sp_addlinkedserver. Bağlantılı sunucu adı MyLinkServer, sonra formu server.catalog.schema.object four-part nesne adı bir parçası olarak belirtilir. Geçerli bir sunucu adı için belirttiğiniz gerekir unutmayın @datasrc.
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'SQLNCLI10',
@datasrc = N'<server name>',
@catalog = N'AdventureWorks2012';
GO
USE AdventureWorks2012;
GO
-- Specify the remote data source using a four-part name
-- in the form linked_server.catalog.schema.object.
UPDATE MyLinkServer.AdventureWorks2012.HumanResources.Department
SET GroupName = N'Public Relations'
WHERE DepartmentID = 4;
B.openquery işlevini kullanarak uzak bir tabloya veri güncelleştirme
Aşağıdaki örnek, uzak bir tablodaki bir satır belirterek güncelleştirir openquery satır kümesi işlevi. Örneğin önceki örnekte oluşturulmuş bağlantılı sunucu adı kullanılır.
UPDATE OPENQUERY (MyLinkServer, 'SELECT GroupName FROM HumanResources.Department WHERE DepartmentID = 4')
SET GroupName = 'Sales and Marketing';
C.opendatasource işlevi kullanarak uzak bir tabloya veri güncelleştirme
Aşağıdaki örnek, belirterek uzak bir tabloya bir satır ekler opendatasource satır kümesi işlevi. Biçimi kullanarak geçerli bir sunucu adı veri kaynağı belirtmek server_nameya server_name\instance_name. Sen-ebilmek lüzum-e örneğinin yapılandırmak SQL ServerAd Hoc dağıtılmış sorgular için. Daha fazla bilgi için, bkz. ad hoc dağıtılmış sorgular sunucu yapılandırma seçeneği.
UPDATE OPENQUERY (MyLinkServer, 'SELECT GroupName FROM HumanResources.Department WHERE DepartmentID = 4')
SET GroupName = 'Sales and Marketing';
Büyük nesne veri türleri güncelleştiriliyor
Bu bölümdeki örnekler, büyük nesne (lob) veri türleriyle tanımlanmış sütun değerlerini güncelleştirme yöntemlerini göstermektedir.
A.GÜNCELLEŞTİRME ile kullanma.Nvarchar(max) sütun verileri değiştirmek için
Aşağıdaki örnek .Kısmi değeri güncelleştirmek için yazma yan DocumentSummary, bir nvarchar(max)sütununda Production.Document tablosu. Kelime componentskelime ile değiştirilir featuresbelirterek yerine word, Word'ün varolan verileri ve değiştirilen (uzunluk) için karakter sayısı yerine başlangıç konumu (ofset). Örnek de output yan tümcesi kullanır önce ve sonra resimleri DocumentSummary sütun @MyTableVartablo değişkeni.
USE AdventureWorks2012;
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
B.GÜNCELLEŞTİRME ile kullanma.Ekleyin ve veri bir nvarchar(max) sütun kaldırmak yazmak
Aşağıdaki örnekler veri ekleyip bir nvarchar(max)sütun değeri null olarak ayarlanmış olan. Çünkü .Yazma yan tümcesi, bir boş sütunu değiştirmek için kullanılamaz, sütunun ilk geçici verilerle doldurulur. Bu verileri kullanarak doğru verilerle sonra değiştirilir.Fıkra yazmak. Ek örnekler veri sütununun değerini ekler, (kesilme) veri sütunu kaldırın ve, nihayet, kısmi veriler sütundan kaldırın. select deyimleri her update deyimi tarafından oluşturulan veri değişikliği görüntüler.
USE AdventureWorks2012;
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
C.Güncelleştirme openrowset ile varbinary(max) sütunda değişiklik yapmak için kullanma
Aşağıdaki örnek depolanan varolan görüntüyü değiştirir bir varbinary(max)yeni bir resim sütun. openrowset işlevini bulk seçeneği ile resim sütununa yüklemek için kullanılır. Bu örnek, bir dosya ismi varsayılmaktadır Tires.jpgiçinde belirtilen dosya yolu var
USE AdventureWorks2012;
GO
UPDATE Production.ProductPhoto
SET ThumbNailPhoto = (
SELECT *
FROM OPENROWSET(BULK 'c:\Tires.jpg', SINGLE_BLOB) AS x )
WHERE ProductPhotoID = 1;
GO
D.FILESTREAM veri değiştirmek için güncelleştirme kullanma
Aşağıdaki örnek dosya sistemi dosyasına'deki verileri değiştirmek için güncelleştirme deyimini kullanır. Bu yöntemi kullanarak büyük miktarda veriyi bir dosyaya akış önermiyoruz. Uygun Win32 arabirimleri kullanır. Aşağıdaki örnek herhangi bir metin dosyası kaydında metinle değiştirir Xray 1. 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ürler güncelleştiriliyor
Aşağıdaki örnekler, clr kullanıcı tanımlı türü (udt) sütunlardaki değerleri değiştirin. Üç yöntem gösterdi. Kullanıcı tanımlı sütunları hakkında daha fazla bilgi için bkz: clr kullanıcı tanımlı türler.
A.Bir sistem veri türünü kullanarak
Sen-ebilmek güncelleştirmek bir udt değer sağlayarak bir SQL Serversistem veri türü, örtülü veya açık dönüştürme türü kullanıcı tanımlı türü desteklediği sürece. Aşağıdaki örnek nasıl bir kullanıcı tanımlı türü sütunundaki bir değeri gösterir Point, açıkça bir dizeden dönüştürerek.
UPDATE dbo.Cities
SET Location = CONVERT(Point, '12.3:46.2')
WHERE Name = 'Anchorage';
UPDATE dbo.Cities
SET Location = CONVERT(Point, '12.3:46.2')
WHERE Name = 'Anchorage';
B.Yöntem çağırma
Güncelleştirme gerçekleştirmek için kullanıcı tanımlı türü bir mutator işaretlenmiş bir yöntem çağırarak bir udt güncelleştirebilirsiniz. Aşağıdaki örnek türü mutator yöntemi çağırır Pointadlı SetXY. Bu türü örneği durumunu güncelleştirir.
UPDATE dbo.Cities
SET Location.SetXY(23.5, 23.5)
WHERE Name = 'Anchorage';
UPDATE dbo.Cities
SET Location.SetXY(23.5, 23.5)
WHERE Name = 'Anchorage';
C.Bir özellik veya veri üye değeri değiştirme
udt kayıtlı özelliği veya ortak veri üyesi kullanıcı tanımlı türü değeri değiştirerek güncelleştirebilirsiniz. Değer sağlayarak ifade özellik türüne örtük olarak dönüştürülebilir olmalıdır. Aşağıdaki örnek özelliğinin değerini değiştirir Xkullanıcı tanımlı türü Point.
UPDATE dbo.Cities
SET Location.X = 23.5
WHERE Name = 'Anchorage';
UPDATE dbo.Cities
SET Location.X = 23.5
WHERE Name = 'Anchorage';
Ipuçlarını kullanarak sorgu en iyi duruma getiricisi varsayılan davranışını geçersiz kılma
Bu bölümdeki örnekler, tablo ve sorgu ipuçları update deyimi işlenirken sorgu en iyi duruma getiricisi varsayılan davranış geçici olarak geçersiz kılmak için nasıl kullanılacağını göstermektedir.
Dikkat |
---|
Çünkü SQL Serversorgu en iyi duruma getiricisi genellikle en iyi bir sorgu yürütme planını seçer, biz ipuçları yalnızca son çare olarak deneyimli geliştiriciler ve veritabanı yöneticileri tarafından kullanılması önerilir. |
A.Tablo ipucu belirtme
Aşağıdaki örnek tablo ipucu tablock. Paylaşılan bir kilit masaya alınır Bu ipucu belirtir Production.Productupdate deyiminin sonuna kadar düzenlendi.
USE AdventureWorks2012;
GO
UPDATE Production.Product
WITH (TABLOCK)
SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE 'BK-%';
GO
B.Sorgu ipucu belirtme
Aşağıdaki örnek sorgu ipucu OPTIMIZE FOR (@variable) update deyimi içinde. Bu ipucu, sorgunun derlenmiş ve optimize belirli bir değeri yerel değişken için kullanılacak sorgu iyileştirici bildirir. Değer, yalnızca sorgu en iyi duruma getirme ve sorgu yürütme sırasında kullanılır.
USE AdventureWorks2012;
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 deyimi sonuçları yakalama
Bu bölümdeki örnekler göstermek nasıl kullanılacağını output yan tümcesi bilgilerden ya da temel ifadeleri geri dönmek için her satırın etkilenen bir update deyimi tarafından. Bu sonuçlar, işleme uygulamasına onay iletileri, arşivleme ve diğer uygulama şartlar gibi şeyler kullanmak için döndürülebilir.
A.Güncelleştirme output yan tümcesi ile kullanma
Aşağıdaki örnek sütun güncelleştirmeler VacationHoursde Employeetablosuna göre yüzde 25'i ilk 10 satırlar ve ayrıca sütunu ayarlar ModifiedDategeçerli tarihe. OUTPUTYan tümcesi değerini döndürür VacationHoursvar uygulamadan önce UPDATEdeyimi deleted.VacationHourssütun ve güncelleştirilmiş değeri de inserted.VacationHourssütun @MyTableVartablo değişkeni.
İki SELECTBu değerleri dönmek deyimleri takip @MyTableVarve güncelleştirme işleminin sonuçlarını Employeetablosu. output yan tümcesi kullanarak daha fazla örnek için bkz: output Yantümcesi (Transact-sql).
USE AdventureWorks2012;
GO
DECLARE @MyTableVar table(
EmpID int NOT NULL,
OldVacationHours int,
NewVacationHours int,
ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25,
ModifiedDate = GETDATE()
OUTPUT inserted.BusinessEntityID,
deleted.VacationHours,
inserted.VacationHours,
inserted.ModifiedDate
INTO @MyTableVar;
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO
--Display the result set of the table.
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO
update kullanarak diğer deyimleri
Bu bölümdeki örnekler güncelleştirme diğer deyimleri kullanmak nasıl kullanıldığını göstermektedir.
A.update kullanarak bir saklı yordam
Aşağıdaki örnek, bir saklı yordam için bir update deyimi kullanır. Yordamı bir girdi parametresini alır @NewHoursve bir çıktı parametresi @RowCount. @NewHours Parametre değeri sütunu güncelleştirmek için update deyiminde kullanılan VacationHourstabloya HumanResources.Employee. @RowCountÇıkış parametresi, yerel bir değişkene etkilenen satırların sayısını döndürmek için kullanılır. Servis TALEBI ifade şartlı için ayarlanan değer belirlemek için set yan tümcesinde kullanılan VacationHours. Ne zaman işçiye ödenen saatlik ( SalariedFlag = 0), VacationHoursSaat artı belirtilen değeri geçerli sayısı ayarlanır @NewHours; Aksi takdirde, VacationHoursiçinde belirtilen değere ayarlanır @NewHours.
USE AdventureWorks2012;
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;
B.update kullanarak a denemek…catch bloğunun
Aşağıdaki örnek, a denemek… içinde bir update deyimi kullanır.catch bloğu sırasında oluşabilecek yürütme hataları işlemek için güncelleştirme işlemi.
USE AdventureWorks2012;
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
Ayrıca bkz.
Başvuru
Metin ve resim işlevler (Transact-sql)
Common_table_expression (Transact-sql)