【发布时间】: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