2015-10-13 89 views
0

我使用这个查询:SELECT SCOPE_IDENTITY()始终返回1

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

您是否检查过您已将您的ID密钥设置为主键? – pedram

+0

不确定这是否与您的方案相关,但只是想知道您提到的表中的哪一列实际上已定义为“身份”列? –

+0

如果您在SQL Server Management Studio中运行它,它将会失败。你在应用程序中运行这个吗?请张贴所有涉及的代码。还指出哪一列被定义为标识列 –

回答

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()是最好的。

1

我知道这是一个古老的线程,但我有同样的问题,我设法进入我的XSD和查询,以解决它,改变的ExecuteMode从NonQuery到Scalar的查询。这停止了​​它总是返回1,而是返回先前添加的行的ID。

这可能是我试图将SELECT添加到INSERT之后,而不是一次完成并且UI为我正确设置它。