2016-12-21 132 views
-1

我正在創建一個Web API,它將獲取帳戶作爲輸入參數,它必須創建/更新SQL Server表中的記錄。因此,Web服務將需要調用將接受該帳戶的存儲過程。我在數據庫中創建了一個示例表,只有兩列,分別爲AccountCounterSeq。我正在嘗試創建一個存儲過程來創建或更新表中的記錄。存儲過程來創建或更新

enter image description here

每個帳戶應該有一個與之關聯的CounterSeq。如果表中不存在Account,則創建Account名稱並將CounterSeq = 001與之關聯。如果Account名已經存在,只是更新一樣CounterSeqCounterSeq + 1

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

爲此,我創建這樣

USE [Demo] 
GO 

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

一個TABLETYPE和存儲過程如下,但是我錯過了如何插入新記錄像一個新的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到CounterSeq + 1

您可以使用此查詢(把它放在你的存儲過程中BEGIN TRANSACTION之間,COMMIT 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