【问题标题】:Get last generated ID and add it to another table ASP.NET获取最后生成的 ID 并将其添加到另一个表 ASP.NET
【发布时间】:2014-04-17 18:53:06
【问题描述】:

如何从主键获取生成的 ID,然后通过 SCOPE_IDENTITY 将其添加到 ASP.NET 中的另一个表? 例如:

最后在 NRRENDOR 列上生成的 ID 是 26 号,我已经删除了这些行。现在,当我将数据添加到数据库时,nexy 在 NRRENDOR 上生成的 ID 将是 27 号。我希望它添加到 NRD 列中。

【问题讨论】:

  • 这与asp.net无关(还是我错了?)
  • add it to another table in ASP.NET 是什么意思?你试过什么代码?
  • 你试过这里描述的方法吗? link
  • @Aristos ,我在 ASP.NET 中编码,所以你可以帮助我编写 SQL Server 中的代码。
  • @Nitin Sawant , NRRENDOR 列在 Table1 中, NRD 列在 Table2 中。不,表 1 中 NRRENDOR 最后生成的 ID 是 26 号,下一个生成的 ID 将是 27 号。27 号我想将它添加到表 2 中的 NRD 列。

标签: c# sql sql-server


【解决方案1】:

在您的 INSERT 代码中,假设它在存储过程中,使用 SCOPE_IDENTITY 将为您获取最后插入的身份,您可以在存储过程中重复使用该身份,也可以返回您的应用以在另一个语句中使用.

一些虚拟 SQL 来演示:

INSERT INTO NRRENDOR(SomeColumn) VALUES(1)

DECLARE @LastID int
// set @LastID to the last id inserted
SELECT @LastID = SCOPE_IDENTITY()

// to use in same procedure
INSERT INTO NRD (SomeColumn) VALUES(@LastID)

// to return it to code - or you could use an output parameter
SELECT @LastID

【讨论】:

  • @aldoblack 您的插入是否真的有效(添加新行)并且主键列是否也实际设置为标识列?
  • 是主键列设置为标识列。它可以工作,但它被添加为 NULL 而不是最后生成的 ID。
【解决方案2】:

这与 ASP.NET 有什么关系? SQL 就足够了。

INSERT INTO [Table2]( NRD)
SELECT  MAX(NRRENDOR)
FROM    Table1
' WITH (ROWLOCK, XLOCK, HOLDLOCK)

执行此操作的正确方法是在以Tanner suggested 执行插入后使用@SCOPE_IDENTITY。值得注意的是,还有另一种获取当前身份的方法,即IDENT_CURRENT。你可以这样使用它

SELECT IDENT_CURRENT('Table1') + 1 as Current_Identity

请注意这一点

谨慎使用 IDENT_CURRENT 预测下一个生成的 身份价值。实际生成的值可能与 IDENT_CURRENT 加上 IDENT_INCR 因为其他人执行的插入 会议。

marc_s 的这条评论总结了一切。 How to get the next identity value from SQL Server

【讨论】:

  • 主键。如果主节点的 MAX 数是 25,最后生成的 ID 是 30,它会给我数字 25 而不是 30。
  • @aldoblack:所以你的PK不是自动的?我是从“从主键生成的 ID”中假设的。如果它是自动生成的,那么最后一个 id 将是最大 id,前提是您没有使用负身份种子。
  • 是的,它是自动的。但是有时我会删除该行。例如,我删除了表中的最后 5 行,因此主键减少了 5。假设我的主键的 MAX 数为 30。但如果我删除最后 5 行,则 MAX 数为 25。但我不想要数字25. 我想要最后生成的 ID,它是 30 号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多