我正在使用此查询:
INSERT INTO [LepidoliteDB].[dbo].[EGelLayerWeighingData] ([EGelWeighingDataID], [Amount], [ContainerID], [Portions],
[PortionNumber], [Canceled], [LayerID], [WeighingDone], [InsertDone],
[MeasuresDone], [StartDateAndTime], [EndDateAndTime])
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
SELECT SCOPE_IDENTITY()
但SCOPE_IDENTITY()
总是返回1.
我错过了什么?
答案 0 :(得分:3)
也许你有一个替代/触发器?您使用的是什么版本的MSSQL?您是否尝试过没有数据库名称?你有没有试过这个开始端块?
答案 1 :(得分:1)
我知道这是一个旧线程,但我遇到了同样的问题,我设法通过进入我的XSD和查询来解决它,将查询的ExecuteMode从NonQuery更改为Scalar。这停止了它总是返回1而是返回先前添加的行的ID。
这可能取决于我之后尝试将SELECT添加到INSERT,而不是一次性完成所有操作并且UI正确地为我做了。
答案 2 :(得分:0)
写它的最好方法是..
RETURN SCOPE_IDENTITY()
您也可以将@@IDENTITY
和IDENT_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。