sql-server - 需要处理多种场景的存储过程

标签 sql-server string stored-procedures sql-insert sql-delete

我有一个相当复杂的(至少对我来说)存储过程需要编写,需要处理来自前端的多个场景。

前端正在传递 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 

以下是存储过程应处理的场景。

  1. levelmarkers插入表后,如果同一用户回来并想要添加其他Levelmarkers,前端将传递旧值新的如下:(1234515-564546-65454,4654342-154658-56767,5465489-546549-65456,1332245-9852135-7841265)

    我的存储过程应该识别出表中已经有前三个 Levelmarkers,并且应该只插入新的。

  2. 如果同一个用户决定删除之前的值,例如两个值,前端会将值传递给我(1234515-564546-65454,4654342-154658-56767)。存储过程应该识别出用户已经删除了两个值,并且应该从表中删除相同的值并保留未删除的值。

  3. 如果用户删除一些值并插入新值,则存储过程应该识别要删除的值并插入新值。

解决这个问题的最佳方法是什么?

最佳答案

认为您可以使用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/

相关文章:

c# - 更新数据库中的信息

SQL 检索方差较小的厚度值

c - 如何从文件中获取替代行并将其作为字符串存储到结构中?

mysql - CONCAT 在 mysql 存储过程中不起作用

mysql - 从 SQL 存储过程中的唯一值查找最大数量

c# - 处理存储过程

sql - 使用存储过程批量插入/更新

java - 计算字符串数组的每个字符串中的反斜杠

python - 如何使用 Python 逻辑检查回文

php - 在 mysql 中存储二进制数据(图像、pdf、mp3、视频等)的最佳方式是什么?为什么?