动态插入到表中,同时检查记录是否已存在

时间:2017-07-19 03:42:54

标签: sql sql-server sql-server-2012

我在插入语句时对动态插入数据有些怀疑,所以只是想得到你们的帮助。我必须做多个插入语句说基于2个不同标准的大约1500条记录,下面只是1个插入语句的示例。 现在,在执行insert语句时,我想动态分配USERID和ROLEid的2列,您可以在下面的查询中看到它们。 因此,例如,userid IN(500个不同的用户ID)和角色id(100个不同的)。

Insert into userrolelist (Userid, Roleid, IsDefault, EffectiveStart, 
EffectiveEnd, Clientid, LastmodifiedUserId, LastmodifiedTimestamp)
Values (161514,1011,1,'2016-01-21 00:00:00.001',Null,16785,0,'2016-01-21 
00:00:00.001')

我确信有一种方法可以根据2个不同的标准进行动态插入,我只是对如何实现这一点感到困惑。主要还因为对于插入前的每个条件,我需要检查表中是否已存在userid + roleid组合。因为如果我不检查它并仍然执行插入,它将引发错误,因为存在基于2个字段的约束。

任何有关此事的帮助将不胜感激。如果问题不是很清楚,请告诉我,如果需要,我可以添加更多解释。谢谢。

1 个答案:

答案 0 :(得分:1)

您没有说出您的用户ID和角色ID列表来自哪里,但由于您为每个用户ID和角色ID指定了不同的编号,我认为它们是单独的列表,而不是单个列表对。我假设它们分别存储在名为userlistrolelist的表中。然后你可以按如下方式进行插入:

insert into userrolelist
    (Userid, Roleid, IsDefault, EffectiveStart, EffectiveEnd, 
    Clientid, LastmodifiedUserId, LastmodifiedTimestamp)
select
    userid, roleid,
    1,'2016-01-21 00:00:00.001',Null,16785,0,
    '2016-01-21 00:00:00.001'
from
    (select userid, roleid 
    from userlist
        cross join rolelist
    ) as userrole
where
    not exists (select 1 from userrolelist as ur where ur.userid=userrole.userid and ur.roleid=userrole.roleid);

子查询构造了所有可能的用户和角色对的列表,因此如果您已经有对的列表,则可以使用它来代替子查询。