【问题标题】:IF EXISTS then Update else do Nothing - SQL SERVER 2012IF EXISTS then Update else do nothing - SQL SERVER 2012
【发布时间】:2017-07-05 14:14:24
【问题描述】:

我有一个表,它为特定用户分配角色。我正在对该表进行大规模更新,其中我将结束与一些用户以前的角色的约会,然后通过插入该表来完成为他们分配新角色。

我正在分别执行这两项操作。对于我的第一个操作,我的代码是这样的。

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

如果没有为该角色分配结束日期,但如果即使有 1 个用户也有结束日期,则整个更新语句将终止。我想使用 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')

表结构:

【问题讨论】:

  • 这看起来很奇怪。您的记录不符合 where 子句中的条件这一事实不应影响符合条件的记录的更新。
  • 是的 - 请说明您想要更新哪些记录。您发布的代码应该可以工作。你想要完成什么(详细)?
  • @ZoharPeled- 所以基本上就像我说的那样,我正在尝试大规模更新/结束日期角色,然后从一些用户那里插入新角色。现在这里的问题是某些用户 HR 可能已经从 FRONT END 进入并手动完成了操作。因此,当我尝试运行 UPDATE AND THEN THE INSERT SCRIPT 时,如果匹配一些已经更改的员工,则整个 UPDATE 和 INSERT 语句将终止。
  • 它终止时是否出现错误?错误信息是什么?
  • 更新或插入是 MERGE 语句的设计用例(有时称为“upsert”)。这已添加到 SQL Server 2008 版,因此可供您使用。 (请参阅此处的 MS 文档 docs.microsoft.com/en-us/sql/t-sql/statements/…

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


【解决方案1】:

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

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

【讨论】:

  • 您确定它应该在 NOT EXISTS 查询中使用 IN 吗?为什么不将其链接到 A.USERID?
  • @lukStorms 我认为如果至少一个用户 ID 在有效端没有价值,他不想进行更新。我在答案中添加了示例数据和输出
  • “至少一个”。好的,那么有道理。
  • @lukStorms 很好,否则,简单的更新(如他发布的原始更新)就足够了。
  • @etsa - 所以我想做一个更新和插入。所以基本上是为了更新,因为同时进行了 100 次更新,可能有一些记录可能已经手动更新。所以我仍然希望代码运行并更新其余部分而不是中断。因为目前如果有任何记录已经更新,那么更新语句会中断并且不会继续其他 99 条记录,插入也是如此。插入,如果值已经存在,则跳过它/什么都不做,仍然做剩余的插入。
猜你喜欢
  • 2014-04-27
  • 2012-08-08
  • 1970-01-01
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
相关资源
最近更新 更多