Aracılığıyla paylaş


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.

Konu bağlantısı simgesi 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 notÖ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 notuDikkat

Çü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

Tablo (Transact-sql) oluştur

CREATE TRIGGER (Transact-SQL)

Imleçler (Transact-sql)

Sil (Transact-sql)

Insert (Transact-sql)

Metin ve resim işlevler (Transact-sql)

Common_table_expression (Transact-sql)

Kavramlar

FILESTREAM (SQL Server)