SCOPE_IDENTITY, @@IDENTITY and IDENT_CURRENT return null



dbo,完全权限,本地SQL Server Express数据库,我创建并拥有的表。

我刚刚在MLA中插入了一行,如果我做一个SELECT * FROM MLA我会得到我刚刚插入的行......

19 2019-04-16 15:02:52.000 Test

"19"是键,它是一个标识列。所以我尝试用这些中的任何一个来获取那把钥匙......

SELECT SCOPE_IDENTITY()
SELECT IDENT_CURRENT('MLA')
SELECT @@IDENTITY

它们都返回 NULL。

该行是用以下代码行插入的:

DbS.Execute(SQL)

其中 DbS 是与服务器的活动、工作连接,也用于插入。然后,我尝试使用以下代码检索密钥:

Dim DT as RecordSet
DT = DbS.Open("SELECT IDENT_CURRENT('USAA_ArgusVal_MLA')")

我可以想象公开赛创造了一个新的范围,这并不能解释@@IDENTITY

更新:这是下面建议的解决方案,我只是将SELECT添加到现有的 INSERT SQL 语句中,并将.Execute更改为使用此代码

SQL &= vbCrLf & "SELECT SCOPE_IDENTITY() AS MLAKey"
Dim DI As RecordSet = DbS.Open(SQL)
If DI.Read Then
    MLAKey = DI!MLAKey
Else
    MLAKey = ""
End If
您可以使用

OUPTUT子句并执行插入+选择作为单个操作:

INSERT INTO MLA(...)
OUTPUT inserted.identity_column_name
VALUES(...)
<</div> div class="one_answers">

您的"dbs"连接可能有一些连接池。

编写 SQL INSERT,然后在同一 SQL 语句中选择标识。最佳解决方案是创建一个存储过程来插入数据,然后返回当前标识。

最新更新