2017-01-11 11 views
1

SQL複数のINSERT OR UPDATE

UPDATE Table SET ... 
IF @@ROWCOUNT = 0 INSERT INTO Table ... 

は、これはうまくいきましたが、今私は、同時に複数の独立したレコードを追加する必要があります私は次のようなものを試しました:

UPDATE Table SET ... 
IF @@ROWCOUNT = 0 INSERT INTO Table ... 

UPDATE Table SET ... 
IF @@ROWCOUNT < 2 INSERT INTO Table ... 

UPDATE Table SET ... 
IF @@ROWCOUNT < 3 INSERT INTO Table ... 

UPDATE Table SET ... 
IF @@ROWCOUNT < 4 INSERT INTO Table ... 

... 1つのトランザクションでそれを保つために。いくつかの可能な方法があるかどうか、私は疑問に思う...どうやら@@ROWCOUNT別の方法をINSERT ED行をカウントし、または私はその概念を誤解していません

を - しかし、それは特定の行がすでに存在する場合であっても、行を追加して第二宣言から始まりますこれをSQLクエリ内で解決します。この特定のケースでは、でなければなりません。すべてのレコードが最初のレコードの存在に依存していると仮定するのはOKですが、100%信頼できるわけではありません。

EDIT - ソリューション:

これは、すべてのアプリケーション(特定の更新は個別にチェックされないことに、注意してください)には可能ではないかもしれないが、私の場合には、それがうまく動作するようにapearsととも整合的であるべきです更新/挿入されたデータのセットが積分されているためです。

UPDATE Table SET ... 
UPDATE Table SET ... 
UPDATE Table SET ... 
UPDATE Table SET ... 
IF @@ROWCOUNT = 0 
BEGIN 
    INSERT INTO Table ... 
    INSERT INTO Table ... 
    INSERT INTO Table ... 
    INSERT INTO Table ... 
END 
+0

これをサブクエリにすることができます。たとえば、 'row_count = 0、row_count = 1のときにテーブルケースに挿入すると、(count(1)を選択するとテーブルからのrow_count); –

+0

ああ待って... '@@ ROWCOUNT'は最初の' UPDATE'の影響を受ける行の数ですか?私のtsqlはかなり錆びています。 –

+0

ええと、私の知識が不足していますが、トランザクションが完了する前に副照会が実際に(新しいデータで)動作するのでしょうか? –

答えて

2

UPDATE TABLE ..... 
 
IF(condition) 
 
BEGIN 
 
/* 
 
do insert here 
 
*/ 
 
END 
 
IF(condition) 
 
BEGIN 
 
/* 
 
do insert here 
 
*/ 
 
END

出典:SQL Tutorials

+0

それは本当に、本当にきれいでシンプルに見えます。私はそれをテストし、テストされるとasnswerとしてマークします。 –

3

A少しクリーナーソリューションあなたの問題は、使用することがあります

DECLARE @Reasons TABLE (Name NVARCHAR(50) PRIMARY KEY, ReasonType NVARCHAR(50)) 

INSERT INTO @Reasons (Name, ReasonType) VALUES (N'Review', N'Old Reason') 

SELECT * FROM @Reasons 

MERGE INTO @Reasons AS Target 
USING (VALUES 
('Recommendation','Other'), 
('Review', 'Marketing'), 
('Internet', 'Promotion') 
) 
     AS Source (NewName, NewReasonType) 
ON Target.Name = Source.NewName 
WHEN MATCHED THEN 
UPDATE SET ReasonType = Source.NewReasonType 
WHEN NOT MATCHED BY TARGET THEN 
INSERT (Name, ReasonType) VALUES (NewName, NewReasonType) ; 

SELECT * FROM @Reasons 

その後、あなたは全か無かを取得します、すべての条件なしに。マージステートメントの詳細については、https://msdn.microsoft.com/en-us/library/bb510625.aspxを参照してください。

+1

ここにUPDATE文がありません...?データが存在する場合は、新しいレコードが作成されない場合にのみ更新する必要があります。 –

+0

ああ、私はその部分を逃した。私は更新されたソリューションを投稿します。 –

+0

これは、受け入れられた答えよりはるかに良い答えです。 –