存储过程以创建或更新

时间:2016-12-21 03:50:10

标签: sql-server stored-procedures asp.net-web-api

我正在创建一个Web API,它将帐户作为输入参数,必须在SQL Server的表中创建/更新记录。因此,Web服务需要调用将接受该帐户的存储过程。我在数据库中创建了一个示例表,其中只有两列名为AccountCounterSeq。我正在尝试创建一个存储过程来创建或更新表中的记录。

enter image description here

每个帐户都应与CounterSeq相关联。如果表格中不存在Account,请创建Account名称并将CounterSeq = 001与其关联。如果Account名称已存在,则只需将CounterSeq更新为CounterSeq + 1

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

为此我创建了一个像这样的TableType

USE [Demo]
GO

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

存储过程如下,但我不知道如何插入新记录,如新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;

1 个答案:

答案 0 :(得分:0)

首先,我认为您传入的表应该只有一个字段(基于您的描述如果数据库中不存在帐户创建帐户名称并将CounterSeq 001与其关联。如果帐户名称已经存在,只需将CounterSeq更新为CounterSeq + 1

您可以使用此查询(将其放在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);