2016-12-21 129 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