SELECT SCOPE_IDENTITY()始终返回1

时间:2015-10-13 06:56:04

标签: sql-server

我正在使用此查询:

INSERT INTO [LepidoliteDB].[dbo].[EGelLayerWeighingData] ([EGelWeighingDataID], [Amount], [ContainerID], [Portions],
[PortionNumber], [Canceled], [LayerID], [WeighingDone], [InsertDone],
[MeasuresDone], [StartDateAndTime], [EndDateAndTime]) 
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);

SELECT SCOPE_IDENTITY()

SCOPE_IDENTITY()总是返回1.

我错过了什么?

4 个答案:

答案 0 :(得分:3)

也许你有一个替代/触发器?您使用的是什么版本的MSSQL?您是否尝试过没有数据库名称?你有没有试过这个开始端块?

您是否阅读了这篇文章@@IDENTITY vs SCOPE_IDENTITY() vs IDENT_CURRENT

答案 1 :(得分:1)

我知道这是一个旧线程,但我遇到了同样的问题,我设法通过进入我的XSD和查询来解决它,将查询的ExecuteMode从NonQuery更改为Scalar。这停止了​​它总是返回1而是返回先前添加的行的ID。

这可能取决于我之后尝试将SELECT添加到INSERT,而不是一次性完成所有操作并且UI正确地为我做了。

答案 2 :(得分:0)

写它的最好方法是..

RETURN  SCOPE_IDENTITY()  

您也可以将@@IDENTITYIDENT_CURRENT用于此

SCOPE_IDENTITY,IDENT_CURRENT和@@ IDENTITY是类似的函数,因为它们返回插入到标识列中的值。

IDENT_CURRENT不受范围和会话的限制;它仅限于指定的表格。 IDENT_CURRENT返回在任何会话和任何范围内为特定表生成的值。有关更多信息,请参阅IDENT_CURRENT(Transact-SQL)。

SCOPE_IDENTITY和@@ IDENTITY返回当前会话中任何表中生成的最后一个标识值。但是,SCOPE_IDENTITY返回仅在当前范围内插入的值; @@ IDENTITY不限于特定范围。

因此RETURN SCOPE_IDENTITY()是最好的。

答案 3 :(得分:0)

我遇到了这个问题,我必须承认这是一个愚蠢的错误,但我认为其他人可能会遇到。我使用的是Execute命令,而不是查询命令,该命令返回受影响的行数。

顺便说一句,我将我的Insert和SELECT SCOPE_IDENTITY()组合在一个命令中,这就是为什么我从Execute命令开始的原因。我仍然可以将它们组合在一起,但是我改用ExecuteScalar。