我有一个包含2列的简单表 - name和主键id。当我插入一个值时,我希望能够在我的代码中立即检索该值。
所以我有:
db.Execute("INSERT INTO table(name) VALUES (@0)",name);
不会自动填充id列并存储行。
那么当名称不唯一时,我怎样才能db.Query();
获取此值?这可能吗?
一个有趣的问题,我认为:)
答案 0 :(得分:7)
您可以使用@@IDENTITY
INSERT INTO table(name) VALUES (@0); SELECT @@IDENTITY;
更新:正如评论中所述,@@IDENTITY
在全球范围内有效,您实际应该使用SCOPE_IDENTITY()
来限制当前范围:
INSERT INTO table(name) VALUES (@0); SELECT SCOPE_IDENTITY();
然后,您可以通过使用ExecuteScalar()
执行插入并获取结果来检索主键/标识。
答案 1 :(得分:3)
你会想要SCOPE_IDENTITY()
使用某些不寻常的情况。类似的东西:
INSERT INTO table(name) VALUES (@0); SELECT Scope_Identity();
为什么不是@@ identity?因为在许多场景中它可能是错误的。 MSDN docs describe它为:
@@ IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT是类似的功能 他们返回插入到IDENTITY列中的最后一个值 表
@@ IDENTITY和SCOPE_IDENTITY将返回最后一个标识值 在当前会话的任何表中生成。但是,SCOPE_IDENTITY 仅在当前范围内返回值; @@ IDENTITY不是 仅限于特定范围。
答案 2 :(得分:1)
使用db.ExecuteScalar
并在SQL语句末尾添加SELECT SCOPE_IDENTITY()
以检索主键。