UPDATE (Transact-SQL)

Bir veya daha fazla sütun bir tablo veya görünümde varolan verileri değiştirir SQL Server 2008 R2.Örnekler için bkz: örnekleri.

Konu bağlantısı simgesiTransact-SQL sözdizimi 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>
    Olarak da bilinen ortak tabloifade (cte) adlı sonuç kümesi veya görünüm, geçici belirtir kapsam update deyimiçinde tanımlanır. cte sonuç kümesi basit bir sorgudan elde edilen ve update deyimtarafından başvurulmaktadır.Daha fazla bilgi için, bkz. Common_table_expression (Transact-SQL) ile.

  • TOP ( expression**)** [ PERCENT ]
    Sayı veya Güncelleştirilecek satırları yüzdesini belirtir.expressionbir sayı veya satırları yüzdesi olabilir.

    INSERT, update, birleştirme veya silme kullanılan üst ifade başvurulan satır herhangi bir sırayla düzenlenmiş değil.

    Sınırlayan parantez expression üst içinde gerekli olan INSERT, update, birleştirme ve delete deyimlerini.Daha fazla bilgi için, bkz. ÜST (Transact-SQL).

  • table_alias
    tablo veya görünüm içinden Güncelleştirilecek satırları olduğunu gösteren from yan tümce belirtilen diğer ad .

  • server_name
    tablo ya da görünümün bulunduğu bağlantılı sunucu adıdır.server_name olarak belirtilen bir bağlantılı sunucu adına veya kullanarak opendatasource işlev.

    Zaman server_name bir bağlantılı sunucuolarak belirtilen database_name ve schema_name gereklidir.server_name , opendatasource ile belirtilen database_name ve schema_name tüm veri kaynaklarına uygulanmayabilir ve ole DBsağlayıcı , erişir yeteneklerini tabi olduğu uzak nesne.Daha fazla bilgi için, bkz. Dağıtılmış sorgular.

  • database_name
    Veritabanının adıdır.

  • schema_name
    tablo ya da görünümün ait olduğu şema addı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_name gerekir güncellenebilir ve başvuru tam olarak temel tablo from yan tümce görünüm.Güncelleştirilebilir görünümler hakkında daha fazla bilgi için bkz: CREATE VIEW (Transact-SQL).

  • rowset_function_limited
    Ya SORGUAÇ veya openrowset işlev.Bu işlevler uzak nesne erişen ole DB sağlayıcı yeteneklerini tabi kullanılır.Daha fazla bilgi için, bkz. Dağıtılmış sorgular.

  • İLE ( <)Table_Hint_Limited > )
    hedeftabloiçin izin verilen bir veya daha çok tablo ipuçlarını 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 İpuçları (Transact-SQL).

  • @table_variable
    Belirtir bir tablokaynak tabloolarak değişken.

  • AYARLAMA
    Güncelleştirilecek sütun veya değişken adlarının listesini belirtir.

  • column_name
    Değiştirilecek veri içeren bir sütun bulunur.column_namemevcut olmalıdır table_or view_name.Kimlik sütunları güncelleştirilemiyor.

  • expression
    Bir değişken, hazır bilgi değeri, ifadeveya tek bir değer döndürür (ile parantez) bir subselect deyim olabilir.Tarafından döndürülen değeri expression içinde varolan değerin yerini alır column_name veya @variable.

    Not

    Unicode karakter veri türlerini başvururken nchar, nvarchar, ve ntext, 'ifade' büyük harfle öneki 'n'.Yoksa 'n' belirtilmezse, SQL Server bir kod sayfası varsayılan harmanlama veritabanı veya sütuniçin karşılık gelen dize dönüştürür.Bu kod sayfası bulunmayan herhangi bir karakter kaybolur.

  • VARSAYILAN
    ' % S'sütun sütun için tanımlanan varsayılan değeri sütunvarolan değerin yerini belirtir.Bu ' % s'sütun sütun hiçbir varsayılan vardır ve null değerlere izin vermek üzere tanımlanmış sütun null olarak değiştirmek için de kullanılabilir.

  • { += | -= | *= | /= | %= | &= | ^= | |= }
    Bileşik atama işleç:

    += Ekleyin ve atama

    -= Çıkarmak ve atama

    * = Çarpın ve atama

    / Bölme ve Ata =

    % = Modül ve atama

    &= Bitwise ve ve Ata

    ^ Bitsel xor = ve atama

    | = Bitwise or ve Ata

    Daha fazla bilgi için, bkz. Bileşik işleçler (Transact-SQL).

  • udt_column_name
    Bir kullanıcı tanımlı tür sütunbulunur.

  • property_name | field_name
    Ortak özellik veya ortak veri üyesi kullanıcı tanımlı türolan.

  • method_name(argument [ ,... n] )
    Başvuramaz ortak mutator yöntem olan udt_column_name , götüren bir veya daha fazla bağımsız değişken.

  • **.**WRITE (expression,@Offset,@Length)
    Belirleyen değerinin bir bölümü column_name değiştirilecek.expressiondeğiştirir @Length birimleri başlamasını @Offset , column_name.Yalnızca sütun varchar(max), nvarchar(max), veya varbinary(max) Bu ' % s'yan yan tümceile belirtilebilir.column_nameBOŞ olamaz ve bir tablo adı veya tablo diğer adile belirtilmiş.

    expressionkopyalanan değeri column_name.expressiongerekir veya için değerlendirmek için dolaylı olarak artığını yapabilmek column_name türü.expression Olan küme null, @Length gözardı edilir ve değer column_name kesilir belirtilen at @Offset.

    @Offset başlangıç noktasıdır değerinde column_name veren expression yazılır.@Offsetsıfır tabanlı sıralı konumunu dir bigint, ve negatif bir sayı.@Offset Null, güncelleştirme işlemi ekler expression sonunda varolan column_name değeri ve @Length göz ardı edilir.@ Uzaklık uzunluğundan büyükse column_name değeri Veritabanı Altyapısı işlevi bir hata.@Offset Artı @Length aşıyor temel alan değeri sütunsonunu silmeyi oluşur kadar son karakter değeri.@Offset len artı (expression) alttaki daha büyük boyutu bildirilen, bir hata ortaya çıkar.

    @Lengthbölümünde başlayarak sütunuzunluğu @Offsetile değiştirilir, expression.@Lengthİş bigint ve olamaz negatif bir sayı.@Length Null, güncelleştirme işlemi tüm verileri kaldırır @Offset sonuna kadar column_name değer.

    Daha fazla bilgi için Açıklamalar'a bakın.

  • @variable
    Tarafından döndürülen değere küme bildirilen bir değişken expression.

    set @variable = column = expression değişken sütunolarak aynı değeri ayarlar.Bu KÜMESİNDEN farklıdır @variable = column, column = expression, pre-update sütundeğeri için değişken ayarlar.

  • <OUTPUT_Clause>
    Veri veya update işlemi bir parçası olarak temel ifadeler döndürür güncelleştirildi.output yan tümce tüm DML deyimleri desteklenmez, hedef uzak tabloları veya görünümler.Daha fazla bilgi için, bkz. output yan tümcesi (Transact-SQL).

  • DAN <table_source>
    Bir tablo, görünüm veya tablo kaynak güncelleştirme işlemi için ölçüt sağlamak için kullanılıp kullanılmayacağını belirtir.Daha fazla bilgi için, bkz. (Transact-SQL).

    Güncelleştirilen nesnenin nesne from yan tümce tümcesinde aynı ve tek bir from yan tümcetümcesinde nesnesine başvuru yoktur, bir diğer ad nesnesi olabilir veya belirtilmemiş olabilir.Güncelleştirilen nesnenin from yan tümcetümcesinde birden fazla saat görünüyorsa, bir ve yalnızca bir nesne başvurusu tablodiğer adbelirtmemesi gerekir. Tüm diğer nesnesine olan başvurular from yan tümce tümcesinde bir nesnenin diğer adiçermelidir.

    Bir update INSTEAD OF tetikleyicisi olan bir görünümde bir from yan tümceiçeren bir güncelleştirme hedef olamaz.

  • BURADA
    Güncelleştirilen satırları sınırla koşulları belirtir.where yan tümce kullanılır, hangi formu temel alan güncelleştirmesi iki biçimi vardır:

    • Aranan güncelleştirmeleri silmek için satır nitelemek için arama koşulu belirtin.

    • Güncelleştirmeleri kullanımı bir imleçbelirtmek için current of yan tümce konumlandırılmış.Güncelleştirme işlemi, geçerli imleçkonumunda oluşur.

  • <search_condition>
    Güncelleştirilecek satırları için karşılanması gereken koşulu belirtir.arama koşulu da birleştirmek dayandırıldığı koşulu olabilir.arama koşuludahil yüklemler sayısına bir sınır yoktur.Yüklemleri ve arama koşulları hakkında daha fazla bilgi için bkz: Arama koşulu (Transact-SQL).

  • GEÇERLİ
    Güncelleştirme geçerli belirtilen imleçkonumuna gerçekleştirildiğini belirtir.

  • GENEL
    Belirleyen cursor_name Genel imleçbaşvurur.

  • cursor_name
    Getirme yapılmalıdır açık imleç adıdır.Hem genel hem de bir yerel imleç adı ise cursor_name var, bu bağımsız değişkeni belirtir genel imleç , global belirtilir; Aksi halde, yerel imleçbaşvurur.imleç , güncelleştirmeleri izin vermesi gerekir.

  • cursor_variable_name
    Bir imleç değişken adıdır.cursor_variable_namegüncelleştirmelere olanak veren bir imleç bulunmanız gerekir.

  • OPTION ( <query_hint> [ ,... n ] )
    En iyi hale getirme ipuçları şeklini özelleştirmek için kullanılır belirtir Veritabanı Altyapısı deyimişler.Daha fazla bilgi için, bkz. Sorgu ipuçları (Transact-SQL).

En iyi yöntemler

Değişken adları update deyimleri etkilenen eski ve yeni değerleri göstermek için kullanılır, ancak yalnızca tek bir kayıt update deyim etkiler, bu kullanılması gerekir.update deyim birden çok kaydı etkiliyorsa, output yan tümce her kayıt için eski ve yeni değerleri döndürmek için kullanın.

from yan tümce belirtirken güncelleştirme işlemi için ölçüt sağlamak için dikkatli olun.Bir update deyim sonuçlar tanımlanmayan deyim update deyim deterministic değil, yalnızca bir değer, diğer bir deyişle, güncelleştirilen her sütun örneği için kullanılabilir olduğunu bir şekilde belirtilmemiş bir from yan tümce içeriyorsa.Bu beklenmedik sonuçlaroluşabilir.Örneğin, update deyim içinde aşağıdaki komut dosyasında, tablo1'de iki satır güncelleştirme deyimfrom yan tümce , nitelikleri karşılamak; Ancak, alınan satır tanımsızdır Table1 satırda güncelleştirmek için kullanılan Table2.

USE AdventureWorks2008R2;
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, her ikisi de satırlar Table2 update deyimfrom yan tümce , nitelikleri karşılamak.Undefined, gelen satır Table2 satırda güncelleştirmek için kullanılacak olan Table1.

USE AdventureWorks2008R2;
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

set rowcount, delete, INSERT, birleştirme ve update deyimleri sonraki sürümünde etkilemez SQL Server.Değil yeni geliştirme çalışmaları, Sil, Ekle ve güncelleştir deyimleri ile set rowcount kullanın ve şu anda kullanan uygulamaları değiştirmek plan.Ayrıca, şu anda set rowcount kullanın delete, INSERT ve update deyimleri için üst sözdizimini kullanmak için bunları yeniden öneririz.

hedeftablo update veya delete deyim için uygulanan READUNCOMMITTED ve nolock ipuçları from yan tümce tümcesinde kullanımını, gelecekteki bir sürüm kaldırılacak dil desteği SQL Server. Bu ipuçları yeni geliştirme çalışmaları, bu bağlamda kullanmaktan kaçının ve bunları kullanan uygulamaları değiştirmek plan.

Veri Türleri

Tüm char ve nchar sütunları sağa edilirken tanımlanmış uzunluğu.

ANSI_PADDING off için küme ise, eklenen verilerden tüm izleyen boşluklar kaldırılır varchar ve nvarchar Sütunlar yalnızca boşluk. içeren dizeleri hariçBu dizelerin boş bir dizekesiliyor.ANSI_PADDING küme on ise, izleyen boşluklar eklenir.Microsoft SQL Server odbc sürücüsü ve SQL Server için ole DB Sağlayıcısı otomatik olarak küme ANSI_PADDING on her bağlantı için.Bu işlem, odbc veri kaynaklarında veya bağlantı özniteliklerini ayarlama veya özellikleri de yapılandırılabilir.Daha fazla bilgi için, bkz. set ANSI_PADDING (Transact-SQL).

Büyük değer veri türleri güncelleştiriliyor

Use .Yaz (expression, @Offset, @Length), kısmi veya tam bir güncelleştirme gerçekleştirmek için yan tümce varchar(max), nvarchar(max), ve varbinary(max) veri türü.Örneğin, kısmi bir güncellemenin bir varchar(max)sütun silin veya bir tam güncelleştirme silmek tüm verileri veya sütunise yalnızca ilk 200 karakter sütundeğiştirme.

En iyi performansı elde etmek için veri eklenmiş veya 8040 bayt katları olan öbek boyutlarda güncelleştirilmiş öneririz.

Veritabanı Altyapısı update deyim aşağıdaki işlemlerden birini neden olduğunda, kısmi bir tam güncelleştirme dönüştürür:

  • Bölümlenmiş görünüm veya tablo anahtarsütun değiştirir.

  • Birden fazla satır değiştirir ve de benzer kümelenmiş dizin anahtar nonconstant bir değerle güncelleştirir.

Kullanamayacağınız .Değeri null sütun veya küme güncelleştirmek için yan tümce yaz column_name için null.

@Offsetve @Length bayt için belirtilen varbinary ve varchar veri türleri ve karakter nvarchar veri türü.Uygun uzaklıklar alfabe (DBCS) çift baytlık karakter kümesi için hesaplanır.

' % S'sütun sütun değiştiren, .yan tümce başvurulan bir çıktı yan tümcetümcesinde tam değer sütun, ya da Yaz görüntüyü önce deleted.column_name ya da sonra görüntüde inserted.column_name, döner belirtilen sütun tablo değişkeni.

Aynı işlevselliği elde etmek için .Diğer karakter ve ikili veri türleri ile yazma, kullanmak ŞEYLER (Transact-SQL).

FILESTREAM verileri güncelleştirme

update deyim null değer, boş değer veya satır içi veri göreceli olarak az miktarda alan FILESTREAM güncelleştirmek için kullanabilirsiniz.Ancak, büyük miktarda veri daha verimli bir dosyaya Win32 arabirimleri kullanarak akış.FILESTREAM alangüncelleştirdiğinizde, dosya sisteminde temel blob verileri değiştirin.FILESTREAM alan küme null olduğunda blob veri alan ile ilişkili silinir.Kullanamayacağınız .FILESTREAM veri kısmi güncelleştirmeler gerçekleştirmek için WRITE().Daha fazla bilgi için, bkz. FILESTREAM genel bakış.

Metin, ntext ve resim sütunlar güncelleştiriliyor

Değiştirme bir text, ntext, veya imageUpdatesütun sütunbaşlatır, geçerli metin imleci, atar ve sütun null ile güncelleştirilen sürece en az bir veri sayfaayırır update deyim birden çok satırı hem kümeleme anahtar ve bir veya daha fazla güncelleştirirken değişebilir, text, ntext, veya image sütunlar, bu sütunlar için kısmi güncelleştirme yürütüldüğünde tam yerini alacak yeni değerler.

Değiştirmek veya büyük bloklar halinde değiştirmek için text, ntext, veya image verileri, WRITETEXT veya updatetext update deyimyerine.

Önemli notÖnemli

ntext, text, Ve image veri türleri kaldırıldı, gelecekteki bir sürüm de Microsoft SQL Server.Yeni geliştirme çalışması bu veri türlerini kullanmaktan kaçının ve bunları kullanan uygulamaları değiştirmek plan.Use nvarchar(max), varchar(max), ve varbinary(max) onun yerine.Daha fazla bilgi için, bkz. Büyük değer veri türleri'ni kullanma.

Hata işleme

hata işleme for update deyim içinde bir try… deyim belirterek uygulayabilirsinizcatch yapı.Daha fazla bilgi için, bkz. İşlemek için try...Transact-SQL'de catch.

BOŞ bir satır için bir güncelleştirme bir kısıtlama veya kuralı ihlal ederse ihlal için sütunya da yeni değeri ayardır uyumsuz veri türü, deyim iptal, bir hata döndürülür ve hiçbir kayıt güncelleştirilir.

Bir update deyim 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ştirilmez.toplu iş geri kalanı yürütülmez ve bir hata iletisi döndürülür.

Boyutunu kümelenmiş dizin ve satır 8,060 bayt aşan bir sütun veya sütunları katılan kümelenmiş dizin güncelleştirmesi neden olursa 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.

tabloGÜNCELLETİRME ilemlerini üzerinde bir INSTEAD of tetikleyicisi tanımladığınızda, tetikleyici update deyimyerine çalışır.Önceki sürümlerinde SQL Server destekleyebilir, sonra tetikleyici tanımlanmış update ve diğer veri değişikliği deyimleri.

Sınırlamalar ve kısıtlamalar

from yan tümce , üzerinde tanımlı bir INSTEAD of tetikleyicisi olan bir görünümde doğrudan veya dolaylı olarak başvuran bir update deyim içinde belirtilemez.Hakkında Tetikleyiciler yerine daha fazla bilgi için bkz: CREATE TRIGGER (Transact-SQL).

set rowcount seçeneği ayar, uzak tablo ve yerel ve uzak bölümlendirilmiş görünümlerde karşı update deyimleri için yoksayılır.

cte deyim içinde yapılan tüm başvurular, bir ortak tabloifade (cte) bir update deyim hedef olduğunda eşleşmesi gerekir. cte bir from yan tümcetümcesinde diğer ad atanmış ise, örneğin, diğer ad cte için tüm diğer başvurular için kullanılması gerekir.Belirli cte başvurular bir cte bir nesne kimliği olmadığı için gerekli olan SQL Server bir nesne ve onun diğer addolaylı ilişkisi tanımak için kullanacağı.Bu ilişki sorgu planı birleştirmek beklenmeyen davranış ve istenmeyen sorgu sonuçlarüretebilir. Aşağıdaki örnekler, cte bir update işlemi hedef nesnesi olduğunda bir cte belirterek, doğru ve yanlış yöntem 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)

Günlüğe kaydetme davranışını

update deyim tam olarak kaydedilir; Ancak, .Yaz eklemek veya yeni veri eklemek güncelleştirmeler veritabanı kurtarma modelini bulk-logged veya basit küme ise en az kaydedilir.Minimal günlüğü değil ne zaman kullanılan .Yazma, varolan değerleri güncelleştirmek için kullanılır.Daha fazla bilgi için, bkz. En az oturum işlemleri.

Güvenlik

İzinler

hedeftablogüncelleştirme izinleri gereklidir. select izinleri gereklidir de update deyim where yan tümceiçeriyorsa veya güncelleştirilen için tablo expression KÜMESİNDE yan tümce sütun tablokullanı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 rolleri ve tablo sahibi izinleri diğer kullanıcılara aktarma

Örnekler

Kategori

Özellikli sözdizimi öğeleri

Temel sözdizimi

GÜNCELLEŞTİRME

Güncelleştirilen satır sınırlama

• ÜST • where ile ortak tablo ifade • where current of

Sütun değerlerini ayarlama

Hesaplanan değerleri • bileþik iþleçler • varsayılan değerleri • alt sorgular

Hedef nesne standart tablolar dışındaki belirtme

• tablo değişkenlerini • tablo diğer adları görüntüler.

Diğer tablolardaki verileri esas veri güncelleştirme

DAN

Uzak bir tablodaki satırların güncelleştirme

bağlantılı sunucu • SORGUAÇ • 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

İpuçlarını kullanarak sorgu en iyi duruma getiricisi varsayılan davranışını geçersiz kılma

• Sorgu ipuçlarıtablo ipuçları

update deyiminin sonuçlarını yakalama

output yan tümce

Diğer ifadeleri Güncelleştir'i kullanma

Saklı yordamlar • try…CATCH

Temel sözdizimi

Bu bölümdeki örnekler en az gerekli sözdizimini kullanarak güncelleştirme deyim temel işlevselliğini göstermektedir.

A.Basit bir update deyimkullanarak

Aşağıdaki örnek tüm satırlar tek bir sütun güncelleştirir Person.Address tablo.

USE AdventureWorks2008R2;
GO
UPDATE Person.Address
SET ModifiedDate = GETDATE();

B.Birden çok sütun güncelleştirme

Aşağıdaki örnek değerler güncelleştirmeleri Bonus, CommissionPct, ve SalesQuota içindeki tüm satırlarla sütunlar SalesPerson tablo.

USE AdventureWorks2008R2;
GO
UPDATE Sales.SalesPerson
SET Bonus = 6000, CommissionPct = .10, SalesQuota = NULL;
GO

Güncelleştirilen satır sınırlama

Bu bölümdeki örnekler update deyimtarafından etkilenen satırların sayısını sınırlamak için kullanabileceğiniz yolları göstermektedir.

A.where yan tümcekullanarak

Aşağıdaki örnek, hangi Güncelleştirilecek satırları belirtmek için where yan tümce kullanır.Değer deyim güncelleştirir Colorsütun Production.Product'Kırmızı' Varolan bir değeri olan tüm satırlar içintablo de Colorsütun ve bir değeri varsa Name'Road-250' ile başlayansütun .

USE AdventureWorks2008R2;
GO
UPDATE Production.Product
SET Color = N'Metallic Red'
WHERE Name LIKE N'Road-250%' AND Color = N'Red';
GO

B.ÜST yan tümcekullanarak

Aşağıdaki örnekler, bir update deyimiçinde değiştirilen satır sayısını sınırlamak için üst yan tümce kullanın.Bir üst zaman (n) yan tümce , güncelleştirme ile kullanıldığında, güncelleştirme işlemi üzerinde rasgele seçim yapılır 'n' satır sayısı.Aşağıdaki örnek güncelleştirmeleri VacationHours sütun 10 rasgele satırlardaki için yüzde 25 olarak Employee tablo.

USE AdventureWorks2008R2;
GO
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25 ;
GO

Anlamlı bir Kronoloji güncelleştirmeleri uygulamak için üst kullanmanız gerekiyorsa, subselect deyimüst order by birlikte kullanmanız gerekir.Aşağıdaki örnek, tatil saatleri 10 çalışanların erken işe alınma tarihleri ile 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.WITH common_table_expression yan tümcekullanarak

Aşağıdaki örnek güncelleştirmeleri PerAssemnblyQty tüm bölümleri ve doğrudan kullanılan bileşenleri veya dolaylı olarak oluşturmak için değer ProductAssemblyID 800.Ortak tabloifade doğrudan oluşturmak için kullanılan bölümleri hiyerarşik bir listesini döndürür ProductAssemblyID 800 ve bu bileşenleri ve oluşturmak için kullanılan bölümleribenzerleri. Yalnızca ortak tablo ifade tarafından döndürülen satır değiştirilir.Özyinelemeli ortak tablo ifadeleri hakkında daha fazla bilgi için bkz: Özyinelemeli sorgular ortak tablo ifadeleri kullanma.

USE AdventureWorks2008R2;
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ümcekullanarak

Aşağıdaki örnekte where current of yan tümce yalnızca imleç konumlandırılmış satır güncelleştirmek için kullanır.Ne zaman bir imleç temel birleştirmekişlemini, yalnızca table_name GÜNCELLEŞTİRMEDE belirtilen deyim değiştirilmiş.' % S'imleç imleç içinde katılan diğer tablolar etkilenmez.

USE AdventureWorks2008R2;
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ğerler, alt sorgular ve varsayılan değerleri kullanarak güncelleştirme sütunları göstermektedir.

A.Hesaplanan bir değer belirtme

Aşağıdaki örnekler, bir update deyimiçinde hesaplanan değerleri kullanır.Örnek değeri iki katına çıkar ListPrice sütun içindeki satırların Product tablo.

USE AdventureWorks2008R2 ;
GO
UPDATE Production.Product
SET ListPrice = ListPrice * 2;
GO

B.Bileşik bir işleçbelirleme

Aşağıdaki örnek, değişken kullanır @NewPrice Geçerli fiyat alma ve it. 10 ekleyerek tüm kırmızı bisiklet fiyatını artırmak için

USE AdventureWorks2008R2;
GO
DECLARE @NewPrice int = 10;
UPDATE Production.Product
SET ListPrice += @NewPrice
WHERE Color = N'Red';
GO

Aşağıdaki örnek, veri eklemek için bileşik işleç += kullanır ' - tool malfunction' sütunvarolan değerine Name sahip satırlar için bir ScrapReasonID 10 ile 12 arasında.

USE AdventureWorks2008R2;
GO
UPDATE Production.ScrapReason 
SET Name += ' - tool malfunction'
WHERE ScrapReasonID BETWEEN 10 and 12;

C.alt sorgu set yan tümcetümcesinde belirtme

Aşağıdaki örnek bir alt sorgu set yan tümce tümcesinde sütungüncelleştirmek için kullanılan değeri belirlemek için kullanır.alt sorgu yalnızca skaler bir değer (diğer bir deyişle, satır başına tek değer) döndürmesi gerekir.Örnek değiştirir SalesYTDsütun SalesPersonen son satış yansıtacak şekildetablo olarak kaydedildiyse SalesOrderHeadertablo. alt sorgu her satış görevlisinin toplayan UPDATEdeyim.

USE AdventureWorks2008R2;
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.VARSAYILAN değerleri kullanarak satırları güncellemek

Aşağıdaki örnek ayarlar CostRate sütun varsayılan değerini (0.00) tüm satırları olan bir CostRate büyük bir 20.00.

USE AdventureWorks2008R2;
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 adveya tablo değişkeni belirterek satır güncelleştirme gösterilmektedir.

A.hedef nesne olarak bir görünümü belirtme

Aşağıdaki örnek, hedef nesne olarak bir görünüm belirterek bir tablo satır güncelleştirir.Birden çok tablo görünüm tanımına başvurur, yalnızca temel tabloların birinden sütunları başvuruda bulunduğundan update deyim ancak başarılı.Her iki tablodan sütun belirtilmiş olması durumunda update deyim başarısız olur.Daha fazla bilgi için, bkz. Bir görünüm üzerinden veri değiştirme.

USE AdventureWorks2008R2;
GO
UPDATE Person.vStateProvinceCountryRegion
SET CountryRegionName = 'United States of America'
WHERE CountryRegionName = 'United States';

B.hedef nesne olarak bir tablodiğer ad belirtme

Aşağıdaki örnek tablosatır güncelleştirirProduction.ScrapReason. Atanan tablodiğer ad ScrapReason update yan tümce hedef nesne olarak belirtilen from yan tümce .

USE AdventureWorks2008R2;
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 bir tablo değişkeni satır güncelleştirir.

USE AdventureWorks2008R2;
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 esas veri güncelleştirme

Bu bölümdeki örnekler, başka bir tablobilgileri temel alarak bir tablo satır güncelleştirme yöntemlerini göstermektedir.

A.Bilgileri başka bir tabloupdate deyim kullanarak

Aşağıdaki örnek değiştirir SalesYTDsütun SalesPersonen son satış yansıtacak şekildetablo olarak kaydedildiyse SalesOrderHeadertablo.

USE AdventureWorks2008R2;
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 tek bu satışı kaydedilir varsayar.Aynı günde birden fazla satış belirtilen bir satış temsilcisi için kaydedilebilir, gösterilen örneðin düzgün çalışmaz.Örnek hata olmadan, ancak her çalışır SalesYTD değeri ne kadar satış gerçekte oluşan o gün. bakılmaksızın tek bir satışı ile güncelleştirilirTek bir update deyim asla iki defa aynı satırı güncelleştirir olmasıdır.

Hangi birden fazla satışla belirtilen bir satış temsilcisi aynı günde oluşabilir için her satış elemanı tüm satış gerekir toplanan birlikte içinde durumda aşağıdaki örnekte gösterildiği gibiUPDATEdeyim:

USE AdventureWorks2008R2;
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 bir tablodaki satırların güncelleştirme

Bu bölümdeki örnekler göstermektedir kullanarak bir uzak hedef tablo satır güncelleştirmek nasıl bir bağlantılı sunucu veya bir satır kümesi işlev uzak tablobaşvurmak için.

A.Verileri uzak tablo bağlantılı sunucu' ı kullanarak güncelleştirme

Aşağıdaki örnek, bir uzak sunucuda bir tablo güncelleştirir.uzak verikaynak bir bağlantı kullanarak oluşturarak örnek başlar sp_addlinkedserver. bağlantılı sunucu adı MyLinkServer, sonra formunda dört nesne adının bir parçası olarak belirtilen server.catalog.schema.object.İçin geçerli bir sunucu adı belirtmeniz gerektiğini 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'AdventureWorks2008R2';
GO
USE AdventureWorks2008R2;
GO
-- Specify the remote data source using a four-part name 
-- in the form linked_server.catalog.schema.object.

UPDATE MyLinkServer.AdventureWorks.HumanResources.Department
SET GroupName = N'Public Relations'
WHERE DepartmentID = 4;

B.SORGUAÇ işlevkullanarak verileri uzak tablo güncelleştirme

Belirterek aşağıdaki örnek satır uzak tablo güncelleştirir SORGUAÇ satır kümesi işlev.Bu örnekte, ö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.Verileri uzak tablo opendatasource işlevkullanarak güncelleştirme

Aşağıdaki örnek, belirterek uzak tablo bir satır ekler opendatasource satır kümesi işlev.Biçimi kullanarak sunucu adı geçerli bir veri kaynak belirtmek sunucu_adı veya server_name\instance_name.örnek yapılandırmanız gerekebilir SQL Server Ad Hoc dağıtılmış sorgular.Daha fazla bilgi için, bkz. ad hoc dağıtılmış sorgular 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ştirme ile kullanma.Nvarchar(max) sütunverilerini değiştirmek yazma

Aşağıdaki örnek .Kısmi bir değeri güncelleştirmek için yazma yan tümce DocumentSummary, bir nvarchar(max) sütun Production.Document tablo.Word components kelimesi yerine features değiştirme word, Word'ün varolan verileri ve karakter sayısı olarak değiştirildi (uzunluk) olacak şekilde değiştirilmesi başlangıç konumu (ofset) belirterek.Bu örnek de output yan tümce kullanır önce ve sonra görüntülerini DocumentSummary sütun @MyTableVar tablo değişkeni.

USE AdventureWorks2008R2;
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ştirme ile kullanma.Ekleyin ve veri bir nvarchar(max) sütunkaldırmak yazma

Aşağıdaki örnekler ekleyip verilerden bir nvarchar(max) sütun değeri şu anda küme null.Çünkü .Yazma yan tümce sütunnull değişiklik yapmak için kullanılamaz, sütun ilk geçici verilerle doldurulur.Bu veriler daha sonra doğru verilerle kullanılarak değiştirilir.yan tümceyazın.Diğer örnekler veri sütun değeri sonuna, (kesme) veri sütun ve, son olarak, kısmi veri sütunkaldırın.select deyimleri her update deyimtarafından oluşturulan veri değişikliği görüntüler.

USE AdventureWorks2008R2;
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.Varbinary(max) sütundeğiştirmek için openrowset ile Güncelleştir'i kullanma

Aşağıdaki örnek depolanan varolan görüntüyü değiştirir bir yeni bir görüntü ilevarbinary(max)sütun . openrowsetişlev bulk seçeneği ile sütunresim yüklemek için kullanılır. Bu örnek, bir dosya adındaki varsayar Tires.jpg belirtilen dosya yolyok.

USE AdventureWorks2008R2;
GO
UPDATE Production.ProductPhoto
SET ThumbNailPhoto = (
    SELECT *
    FROM OPENROWSET(BULK 'c:\Tires.jpg', SINGLE_BLOB) AS x )
WHERE ProductPhotoID = 1;
GO

D.FILESTREAM veriyi değiştirmek için Güncelleştir'i kullanma

Aşağıdaki örnek dosya sistemi dosyasına'deki verileri değiştirmek için update deyim kullanır.Büyük miktarda veriyi bir dosyaya akış için bu yöntem önerilmez.Uygun Win32 arabirimleri kullanır.Aşağıdaki örnek herhangi bir metin dosyası kayıt içindeki metinle değiştirir Xray 1.Daha fazla bilgi için, bkz. FILESTREAM genel bakış.

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öntemi gösterilmiştir.Kullanıcı tanımlı sütunları hakkında daha fazla bilgi için bkz: clr kullanıcı tanımlı türler.

A.Sistem veri türünü kullanarak

UDT değer sağlayarak güncelleştirmek bir SQL Server Sistem veri türü olarak kullanıcı tanımlı tür destekler örtülü veya açık dönüştürme o türü.Aşağıdaki örnek, kullanıcı tanımlı türbir sütun değeri güncelleştirmek gösterilmiştirPoint, açıkça bir dizedönüştürerek.

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ürbir mutator işaretlenmiş bir yöntemçağırarak bir UDT güncelleştirebilirsiniz.Aşağıdaki örnek türü mutator yöntem çağıran Point adlı SetXY.Bu tür örnek durumunu güncelleştirir.

UPDATE dbo.Cities
SET Location.SetXY(23.5, 23.5)
WHERE Name = 'Anchorage';

C.Bir özellik veya veri üyesideğeri değiştirme

UDT kayıtlı bir özellik veya ortak veri üyesi kullanıcı tanımlı türdeğiştirerek güncelleştirebilirsiniz.Değerini sağlama ifade özelliktürüne örtük olarak dönüştürülebilir olmalıdır.Aşağıdaki örnek özellikdeğerini değiştirirX kullanıcı tanımlı tür Point.

UPDATE dbo.Cities
SET Location.X = 23.5
WHERE Name = 'Anchorage';

İpuçlarını kullanarak sorgu en iyi duruma getiricisi varsayılan davranışını geçersiz kılma

Bu bölümdeki örnekler, sorgu iyileştiricisi varsayılan davranışını update deyimişlerken geçici olarak geçersiz kılmak için tablo ve sorgu ipuçları nasıl kullanıldığını göstermektedir.

Dikkat notuDikkat

Çünkü SQL Server sorgu iyileştiricisi genellikle bir sorgu için en iyi yürütme planını seçer, ipuçları yalnızca son çare olarak deneyimli geliştiriciler ve veritabanı yöneticileri tarafından kullanılması önerilir.

A.Bir tablo ipucu belirtme

Aşağıdaki örnekte verilmiştir tablo ipucu tablock.Paylaşılan bir kilit tabloalınır Bu ipucu belirtirProduction.Product ve update deyimsonuna kadar tutulur.

USE AdventureWorks2008R2;
GO
UPDATE Production.Product
WITH (TABLOCK)
SET ListPrice = ListPrice * 1.10
WHERE ProductNumber LIKE 'BK-%';
GO

B.Bir sorgu ipucu belirtme

Aşağıdaki örnekte verilmiştir sorgu ipucuOPTIMIZE FOR (@variable) update deyim.Bu ipucu, sorgunun derlenmiş ve en iyi duruma getirilmiş bir yerel değişken için belirli bir değeri kullanmak için sorgu iyileştiricisi bildirir.Değer, yalnızca sorgu en iyi duruma getirilmesi sırasında ve sorgu yürütme sırasında değil kullanılır.

USE AdventureWorks2008R2;
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 örnekler göstermektedir nasıl kullanılacağını output yan tümcesi iade bilgileri veya ifadeler esas alan, her satır bir update deyimtarafından etkilenen.Bu sonuçlar , işleme uygulamasına onay iletileri, arşivleme ve diğer tür uygulama gereksinimleri gibi şeyler kullanmak için döndürülebilir.

A.Güncelleştirme ile output yan tümcekullanarak

Aşağıdaki örnek sütungüncelleştirirVacationHours , Employeetablo yüzde 25'i ilk 10 tarafından satırları ve ayrıca sütundeğerini ayarlar ModifiedDate Geçerli tarih. OUTPUTyan tümce değerini döndürür VacationHours var olan uygulamadan önce UPDATEdeyim içinde deleted.VacationHourssütun ve güncelleştirilmiş değeri inserted.VacationHourssütun @MyTableVartablo değişkeni.

İki SELECT deyimlerini izleyin değerleri dönmek @MyTableVar ve güncelleştirme işlemi sonuçlar Employee tablo.output yan tümcekullanarak daha fazla örnek için bkz: output yan tümcesi (Transact-SQL).

USE AdventureWorks2008R2;
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

Diğer ifadeleri Güncelleştir'i kullanma

Bu bölümdeki örnekler, diğer tablolarda güncelleştirme nasıl kullanıldığını göstermektedir.

A.saklı yordamGüncelleştir'i kullanma

Aşağıdaki örnek saklı yordambir update deyim kullanır.Bir girdi parametresini mi, yordam sürer @NewHours ve bir çıkış parametresi @RowCount.@NewHours Parametre değeri ' % s'sütun sütungüncelleştirmek için update deyim kullanılır VacationHours tablo HumanResources.Employee.@RowCount Çıkış parametresi, yerel bir değişken etkilenen satırların sayısını döndürmek için kullanılırcase ifade koşullu olarak küme için bir değer belirlemek için set yan tümce tümcesinde kullanılan VacationHours.Ne zaman çalışanı ödenen saatlik (SalariedFlag = 0), VacationHours saat artı değeri geçerli sayısını küme belirtilen @NewHours; Aksi takdirde, VacationHours küme değeri belirtilmişse @NewHours.

USE AdventureWorks2008R2;
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.try… Güncelleştir'i kullanmacatch bloğunun

Aşağıdaki örnek, bir update deyim içinde bir try… kullanır.Sırasında ortaya çıkabilecek yürütme hataları işlemek için catch blok güncelleştirme işlemi.Daha fazla bilgi için, bkz. İşlemek için try...Transact-SQL'de catch.

USE AdventureWorks2008R2;
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