2016-12-21 19 views
-1

SQL APIのテーブルにレコードを作成/更新する必要がある入力パラメータとしてアカウントを取得するWeb APIの作成に取り組んでいます。したがって、Webサービスは、アカウントを受け入れるストアドプロシージャを呼び出す必要があります。私は、AccountCounterSeqという2つの列を持つサンプルテーブルをデータベースに作成しました。テーブルのレコードを作成または更新するストアドプロシージャを作成しようとしています。作成または更新するストアドプロシージャ

enter image description here

各アカウントには、それに関連付けられているCounterSeqを持つ必要があります。テーブルにAccountが存在しない場合は、Accountという名前を作成し、CounterSeq = 001を関連付けます。 Account名がすでに存在する場合は、ちょうど私がこの

USE [Demo] 
GO 

-- Create the data type 
CREATE TYPE projectName_TT AS TABLE 
(
    Account  nvarchar(50), 
    CounterSeq int 
) 
GO 

ようTABLETYPE、以下のようにストアドプロシージャを作成CounterSeqこのため

+---------+----------------+ 
| Account | CounterSeq  | 
+---------+----------------+ 
| ABC  | 001   |   
| DEF  | 002   |  
+---------+----------------+ 

CounterSeq + 1に似更新が、私は新しいを挿入する方法行方不明です新しいAccountのように記録してCounterSeqを001に設定する方法は?

USE [Demo] 
GO 

ALTER PROCEDURE [dbo].[uspInserorUpdateProjectName] 
    @projectName_TT AS projectName_TT READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 
BEGIN TRANSACTION; 
    UPDATE prj 
    SET prj.Account = tt.Account, 
     prj.CounterSeq = tt.CounterSeq + 1 
    FROM dbo.[ProjectName] prj 
    INNER JOIN @projectName_TT tt ON prj.Account = tt.Account 

    INSERT INTO [dbo].[ProjectName](Account, CounterSeq) 
     SELECT tt.Account, tt.CounterSeq 
     FROM @projectName_TT tt 
     WHERE NOT EXISTS (SELECT 1 
          FROM [dbo].[ProjectName] 
          WHERE Account = tt.Account) 

    COMMIT TRANSACTION; 
END; 

答えて

0

まず、私はそれにアカウント名と関連付けるCounterSeq 001を作成するアカウントがデータベースに存在しない場合は、渡されたテーブルでのみご説明に基づいて(一つのフィールドを持つべきであると考えています。場合アカウント名はすでにちょうどCounterSeq + 1にCounterSeqのように更新が存在する)

あなたはBEGIN TRANSACTIONCOMMIT TRANSACTION間ストアドプロシージャにそれを置く(このクエリを使用することができます。

MERGE dbo.[ProjectName] prj 
USING @projectName_TT tt 
ON prj.Account = tt.Account 
WHEN MATCHED THEN UPDATE SET prj.CounterSeq = prj.CounterSeq+1 
WHEN NOT MATCHED THEN INSERT (Account,CounterSeq) 
VALUES (tt.Account, 1); 
+0

私はそれが必要になります001になるのは、ただ1つではなく可能ですか? – user4912134

+0

テーブル(画像)についてのあなたの説明によると、データタイプは 'int'です。あなたがデータベースに入れたものは、それがどのように表示されるかとは関係がありません。 – DVT

+0

ちょうど最後の質問は、マージの代わりにセパレートの挿入/更新をすることに間違いがあります。 – user4912134

関連する問題