0

この質問は、時々取得する SqlException: タイムアウトの期限切れに関連しています。実際、私はIF EXISTS... UPDATE .. ELSE .. INSERT自分のアプリで頻繁に使用しています。しかし、ユーザーの Remus Rusanu は、これを使うべきではないと言っています。これを使用すべきではない理由と、どのような危険性が含まれているか。だから、もし私が持っているなら

IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')
    UPDATE Table1 SET (...) WHERE Column1='SomeValue'
ELSE
    INSERT INTO Table1 VALUES (...)

このステートメントを書き直して機能させるにはどうすればよいですか?

4

4 に答える 4

1

マージは、最初のケースでは 2 つのテーブルを比較するために作成されるため、その場合はマージを使用できます。

以下を見てください。これも別のオプションです。

この場合、残念ながら同時実行性に問題が発生する可能性があります。

--Just update a row 
UPDATE Table1 SET (...) WHERE Column1='SomeValue'
   -- If 0 rows are updated ...
  IF @@ROWCOUNT=0
--Insert Row
INSERT INTO Table1 VALUES (...)

このブログでは、その詳細を説明しています

さらに、この興味深いブログは並行性に関するものです。

于 2013-06-11T08:57:39.113 に答える
1

この場合の MERGE ステートメントの例は次のようになります。

MERGE INTO Table1 t1
USING (SELECT 'SomeValue' as Column_id FROM dual) t2 ON
(t1.column_id = t2.column_id)
WHEN MATCHED THEN
    UPDATE SET(...)
WHEN NOT MATCHED THEN
    INSERT (t1.column_id)
    VALUES ('SomeValue');
于 2013-06-11T09:21:12.167 に答える