更新,然后插入存储过程

时间:2019-03-25 07:17:02

标签: sql sql-server stored-procedures

我不确定在存储过程中先插入后进行更新的正确方法。

$(document).ready(function($) {
  $('#as-member').click(function(e){
    $('.members-section:not(.test-member)').not(this).toggleClass('unselected');
    // here -----------^^^^^^^^^^^^^^^^^^^^-----------------
  });         
});

2 个答案:

答案 0 :(得分:4)

对当前代码进行简单的更改就可以为您提供所需的内容。 不必搞乱@@Identity(这几乎从来都不是正确的事),您只需计算一次@Id值的哈希,将其存储在局部变量中,然后将其用于两个{{ 1}}语句和insert语句的where子句-也就是说,假设update列是唯一的。

话虽这么说,但我不确定为什么需要HashId列和rowId列-除非其中之一旨在通过生命周期中的update语句更改其值的行-您只是保留冗余数据。

这是存储过程的改进版本:

incId

答案 1 :(得分:2)

有一个很棒的关键字OUTPUTAs MSDN says

  

从受影响的每一行返回信息或基于表达式的信息   通过INSERT,UPDATE,DELETE或MERGE语句。这些结果可以是   返回到处理应用程序以用于诸如   确认消息,归档和其他此类应用程序   要求。结果也可以插入表或表中   变量。另外,您可以捕获输出的结果   嵌套INSERT,UPDATE,DELETE或MERGE语句中的子句,以及   将这些结果插入目标表或视图中。

您可以通过OUTPUT关键字将插入的ID插入表中。例如:

DECLARE @InsertedIDs TABLE (ID varbinary(8000))

INSERT INTO empTable(
    LastName,
    FirstName,
    hash_id
 )
OUTPUT HashBytes('SHA2_256', cast(INSERTED.ID as varbinary(50))) INTO @InsertedIDs(ID)
 VALUES(
 @lastName,
 @firstName,
 HashBytes('SHA2_256', cast(@id as varbinary(50)))
 )

UPDATE empTable
Set rowId = incId  -- both are columns in empTable
WHERE hash_id in (SELECT ID IN @InsertedIDs)