我有一个相当复杂的(至少对我来说)存储过程需要编写,需要处理来自前端的多个场景。
前端正在传递 2 个具有如下值的参数
@Levelmarker= (1234515-564546-65454,4654342-154658-56767,5465489-546549-65456)
这些是以逗号分隔的 GUID。
@`UserNameId= (5797823-65432143-65451213)
在前端输入此数据的用户的 GUID
这些值需要转到具有以下结构的表:
CREATE TABLE LevelTable
(
LevelId uniqueidentifier NOT NULL
LevelMarker uniqueidentiriet NOT NULL
UserName uniqueidentifier NOT NULL
);
我希望值像这样进入表中:
LevelId Levelmarker UserName
--------------------------------------------------------
NEWID() 1234515-564546-65454 5797823-654321-65451
NEWID() 4654342-154658-56767 5797823-654321-65451
NEWID() 5465489-546549-65456 5797823-654321-65451
以下是存储过程应处理的场景。
将
levelmarkers
插入表后,如果同一用户回来并想要添加其他Levelmarkers
,前端将传递旧值新的如下:(1234515-564546-65454,4654342-154658-56767,5465489-546549-65456,1332245-9852135-7841265)
。我的存储过程应该识别出表中已经有前三个
Levelmarkers
,并且应该只插入新的。如果同一个用户决定删除之前的值,例如两个值,前端会将值传递给我
(1234515-564546-65454,4654342-154658-56767)
。存储过程应该识别出用户已经删除了两个值,并且应该从表中删除相同的值并保留未删除的值。如果用户删除一些值并插入新值,则存储过程应该识别要删除的值并插入新值。
解决这个问题的最佳方法是什么?
最佳答案
我认为您可以使用string_split()
和merge
语句在单个查询中完成此操作:
merge leveltable t
using (
select value levelmarker, @UserNameId username
from string_split(@LeveMarker, ',')
) s
on (s.levelmarker = t.levelmarker and s.username = t.username)
when not matched by target
then insert (leveid, levelmarker, username)
values (newid(), s.levelmarker, s.username)
when not matched by source
then delete
在 using
子句中,我们将 @LevelMarker
参数拆分为新行,并关联给定的 @UserNameId
。然后,merge
语句检查目标表中是否已存在每个组合,并相应地创建或删除行。
关于sql-server - 需要处理多种场景的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64518919/