Insert、Update保演にSQLサーバー
-
08-06-2019 - |
質問
立ちたいと思っていま保存されている論文集と更新を行いる場合が存在し、そうでない場合ははいをサポートしていません。うするとどうなるのかわかりません
update myTable set Col1=@col1, Col2=@col2 where ID=@ID
if @@rowcount = 0
insert into myTable (Col1, Col2) values (@col1, @col2)
私のロジックで書くことによってこのように更新を行う暗黙の選択使用が条場合は0を返しますし、挿入を行います。
これらのこういを選択し、それに基づくステートメントに返された行数をかいて更新を行いまをサポートしていません。こうして非効率だといわれているのでだいて更新を行い影響を与えてしまうことにもなり2を選択(最初の明示的に選択電話での暗黙のが、アップデート)場合は,たい挿入しいのではない差を効率化が相当進んでいます。
私はロジック音。こういうを組み合わせることで、この挿入や更新に保存されている,?
解決
お前提であり、これは最適な方法です upsert/merge.
重要UPSERTからsqlservercentral.com:
毎更新の場合は上記を除去一 追加から読み取られたテーブルした場合 利用のUPSERTの代わりに存在する。残念ながら挿入、 UPSERTが存在する手法の利用 同じ番号の読み込みます。そのためのチェックが存在 る場合のみであ 非常に有効な理由を正当化する 追加のI/O最適化された方へ うにしてください いて読み込みしてい DBです。
サンプルデータのダウンロードには、旧総督邸と国際民俗芸術 ます。ない場合は列の影響を受ける 更新しをサポートしていません。ほとんど のような状況の下、行ってお 存在し、一つのI/Oます が必要です。
編集:ご覧ください この答え のリンクのブログへの投稿問題について学びこのパターンやそれを動作させるために安全です。
他のヒント
をお読みください ポストを自分のブログ のための良い、安全なパターンでご利用いただけます。多くの配慮を受け答えでこの問題について考えから遠いので安心です。
ク答え以下をお試しください。で作るSQL2000年以上です。SQL2005年でエラー処理はますますその他のオプションをSQL2008するこの統合コマンドです。
begin tran
update t with (serializable)
set hitCount = hitCount + 1
where pk = @id
if @@rowcount = 0
begin
insert t (pk, hitCount)
values (@id,1)
end
commit tran
場合に使用されるSQL Server2000/2005のコードが必要で囲むの取引を確認するデータは一貫して同定した。
BEGIN TRANSACTION Upsert
update myTable set Col1=@col1, Col2=@col2 where ID=@ID
if @@rowcount = 0
insert into myTable (Col1, Col2) values (@col1, @col2)
COMMIT TRANSACTION Upsert
この場合は追加のコストパフォーマンスがデータの整合性を保証します。
追加として示唆し、それを受けて、追加すべき使用が可能です。
合併の新機能は、SQL Server2008にあります。
だけでなくを走らせることも必要ですので、取引でもニーズの高い分離する。いいデフォルトの分離レベルの読み込みCommited、このコードに必要な直列化可能です。
SET transaction isolation level SERIALIZABLE
BEGIN TRANSACTION Upsert
UPDATE myTable set Col1=@col1, Col2=@col2 where ID=@ID
if @@rowcount = 0
begin
INSERT into myTable (ID, Col1, Col2) values (@ID @col1, @col2)
end
COMMIT TRANSACTION Upsert
その追加または@@エラーチェックやロールバックできる良い方法がありました。
だって、統合アプリケーションでは2008年必ず交換してください:
場合は@@rowcount=0@@error=0
その場合は更新に失敗した理由でそのような挿入とその後のrowcountに失敗したの声が0の
大ファンのUPSERT、減のコードで管理いたします。こちらの方法のひとつです。い:一つの入力パラメータのIDである場合、IDがNULLの場合は0んで挿入し、そうでない場合は、更新。想の適用を知りがある場合はID、ポ作業の場合どのような状況でも、カットを実行し半ばにしています。
おたらしい音ですが、も考えておいた方がよいでしょう追加コード防止のために挿入しまった場合に渡された特定のその有効なタイプを利用します。
そうではない場合、いった挿入する場合は更新かに影響の記録とその誰かに削除を記録する前に"UPSERT"を運?現在の記録だそうとしていると更新が存在しないることがはいでしょう。を記録です。となっていると思われるかの動きを見ているわけです。
変更Dima Malenkoポスト:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION UPSERT
UPDATE MYTABLE
SET COL1 = @col1,
COL2 = @col2
WHERE ID = @ID
IF @@rowcount = 0
BEGIN
INSERT INTO MYTABLE
(ID,
COL1,
COL2)
VALUES (@ID,
@col1,
@col2)
END
IF @@Error > 0
BEGIN
INSERT INTO MYERRORTABLE
(ID,
COL1,
COL2)
VALUES (@ID,
@col1,
@col2)
END
COMMIT TRANSACTION UPSERT
できるトラップのエラーを記録し、失敗を挿入します。
ためにあるからこそだと思いまいデータを送WSDL、できれば固定します。