我正在创建一个Web API,它将帐户作为输入参数,必须在SQL Server的表中创建/更新记录。因此,Web服务需要调用将接受该帐户的存储过程。我在数据库中创建了一个示例表,其中只有两列名为Account
和CounterSeq
。我正在尝试创建一个存储过程来创建或更新表中的记录。
每个帐户都应与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;
答案 0 :(得分: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);