如果EXISTS然后更新其他什么都不做 - SQL SERVER 2012

时间:2017-07-05 14:14:25

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

我有一个表格,可以为特定用户分配角色。我正在对这个表进行大规模更新,在这里我最终约会了一些用户以前的角色,然后通过插入到这个表中完成了为他们分配新角色。

我正在分别做这两个动作。对于我的第一个动作,我的代码是这样的。

UPDATE userrolelist
SET effectiveend = '2016-01-20 00:00:00.000'
where userid IN ('150920','160847','160848','160849')
and roleid = '1037' and effectiveend IS NULL

如果没有为该角色分配结束日期,但如果有一个用户的结束日期,整个更新语句将终止,则此方法有效。我想使用IF EXISTS语句首先检查此用户的结束日期是否存在,如果没有,则更新否则不执行任何操作。

插入类似。我正在运行基于需要具有新角色的用户的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')

表格结构:

Table Structure

1 个答案:

答案 0 :(得分:2)

我不确定我是否理解你的问题,但也许你可以试试这个:

UPDATE A SET EFFECTIVEEND = '2016-01-20 00:00:00.000'
FROM USERROLELIST A
WHERE A.USERID IN ('150920','160847','160848','160849')
AND A.ROLEID = '1037' AND A.EFFECTIVEEND IS NULL
AND NOT EXISTS(SELECT 1 FROM USERROLELIST B WHERE B.USERID IN ('150920','160847','160848','160849') AND B.effectiveend IS NOT NULL) ;

示例数据:

CREATE TABLE USERROLELIST  (USERID INT, ROLEID INT, EFFECTIVEEND DATETIME);
INSERT INTO USERROLELIST VALUES (150920, 1037,NULL);
INSERT INTO USERROLELIST VALUES (160847, 1037,NULL);
INSERT INTO USERROLELIST VALUES (160848, 1037,NULL);
INSERT INTO USERROLELIST VALUES (160849, 1037,NULL);
INSERT INTO USERROLELIST VALUES (160850, 1037,NULL);

输出:

USERID  ROLEID  EFFECTIVEEND
150920  1037    2016-01-20 00:00:00.000
160847  1037    2016-01-20 00:00:00.000
160848  1037    2016-01-20 00:00:00.000
160849  1037    2016-01-20 00:00:00.000
160850  1037    NULL

样品2:

TRUNCATE TABLE USERROLELIST
INSERT INTO USERROLELIST VALUES (150920, 1037,NULL);
INSERT INTO USERROLELIST VALUES (160847, 1037,NULL);
INSERT INTO USERROLELIST VALUES (160848, 1037,NULL);
INSERT INTO USERROLELIST VALUES (160849, 1037,NULL);
INSERT INTO USERROLELIST VALUES (160850, 1037,NULL);
UPDATE USERROLELIST SET EFFECTIVEEND='20160119' WHERE USERID=150920;

输出:

USERID  ROLEID  EFFECTIVEEND
150920  1037    2016-01-19 00:00:00.000
160847  1037    NULL
160848  1037    NULL
160849  1037    NULL
160850  1037    NULL