我将用一个例子解释问题:
我的数据库中有两个表,名为entry,tags
两个表中都有一个名为ID_ENTRY的列。当我向表格,条目添加记录时,我必须获取最后添加记录的ID_ENTRY并将其添加到表格,标签。我该怎么办?
答案 0 :(得分:4)
执行此操作的唯一方法是使用多个语句。使用动态sql,您可以通过使用分号分隔查询字符串中的每个语句来执行此操作:
"DECLARE @ID int;INSERT INTO [Entry] (...) VALUES ...; SELECT @ID = scope_identity();INSERT INTO [TAGS] (ID_ENTRY) VALUES (@ID);"
确保将其放入事务中以防止并发问题并保持原子性。如果需要,您还可以将其分解为两个单独的查询以在中间返回新的ID值;只需确保两个查询都在同一个事务中。
另外:你正在使用动态sql参数化查询,对吧?如果你不是,我会亲自到那里用湿面条给你打10,000次,直到你忏悔你的不安全方式。
答案 1 :(得分:0)
如果您拥有推送到可用的标签表所需的所有数据,我可能会在命名条目表上使用INSERT触发器执行此操作。如果没有,那么您可能需要考虑使用在事务内创建两者的存储过程。
如果您想在代码中执行此操作,则需要更具体地了解如何管理数据。您使用的是DataAdapter,DataTables,LINQ,NHibernate,......?实际上,您需要将两个插入包装在某种事务中,以便插入执行或不执行,但执行此操作的方法取决于您用于与数据库交互的技术。
答案 2 :(得分:0)
在第一个表上执行insert语句后立即执行“SELECT @@ identity”查询@@ IDENTITY。这将检索最后一个自动生成的ID ...然后将其插入第二个表。
如果您正在使用触发器或插入行的东西......这可能不起作用。使用Scope_Identity()代替@@ IDENTITY
答案 3 :(得分:0)
如果你使用动态sql,为什么不使用Linq到Entity Framework,现在EF是微软推荐的数据访问技术(参见ADO.NET团队博客中的这篇文章Clarifying the message on L2S Futures),如果你做了插入使用EF,最后一个身份ID将自动为您提供,我一直使用它很容易。
希望这有帮助!
雷