Sql server SELECT SCOPE_IDENTITY()始终返回1
我正在使用此查询:Sql server SELECT SCOPE_IDENTITY()始终返回1,sql-server,Sql Server,我正在使用此查询: INSERT INTO [LepidoliteDB].[dbo].[EGelLayerWeighingData] ([EGelWeighingDataID], [Amount], [ContainerID], [Portions], [PortionNumber], [Canceled], [LayerID], [WeighingDone], [InsertDone], [MeasuresDone], [StartDateAndTime], [EndDateAndTime])
INSERT INTO [LepidoliteDB].[dbo].[EGelLayerWeighingData] ([EGelWeighingDataID], [Amount], [ContainerID], [Portions],
[PortionNumber], [Canceled], [LayerID], [WeighingDone], [InsertDone],
[MeasuresDone], [StartDateAndTime], [EndDateAndTime])
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
SELECT SCOPE_IDENTITY()
但是SCOPE\u IDENTITY()
总是返回1
我遗漏了什么?最好的写作方法是
RETURN SCOPE_IDENTITY()
您也可以使用@@IDENTITY
和IDENT_CURRENT
来执行此操作
SCOPE_IDENTITY、IDENT_CURRENT和@IDENTITY是类似的函数,因为它们返回插入到标识列中的值
当前标识不受范围和会话的限制;它仅限于指定的表。IDENT_CURRENT返回为任何会话和任何作用域中的特定表生成的值。有关详细信息,请参阅当前标识(Transact-SQL)
SCOPE_IDENTITY和@IDENTITY返回在当前会话的任何表中生成的最后一个标识值。但是,SCOPE_IDENTITY返回仅在当前范围内插入的值@@标识不限于特定的范围
因此,RETURN SCOPE_IDENTITY()是最好的方法。编写它的最好方法是
RETURN SCOPE_IDENTITY()
您也可以使用@@IDENTITY
和IDENT_CURRENT
来执行此操作
SCOPE_IDENTITY、IDENT_CURRENT和@IDENTITY是类似的函数,因为它们返回插入到标识列中的值
当前标识不受范围和会话的限制;它仅限于指定的表。IDENT_CURRENT返回为任何会话和任何作用域中的特定表生成的值。有关详细信息,请参阅当前标识(Transact-SQL)
SCOPE_IDENTITY和@IDENTITY返回在当前会话的任何表中生成的最后一个标识值。但是,SCOPE_IDENTITY返回仅在当前范围内插入的值@@标识不限于特定的范围
因此,RETURN SCOPE_IDENTITY()是最好的一个。这里可能有一个代替/for的触发器?您使用的是什么版本的MSSQL?您是否尝试过在没有数据库名称的情况下执行此操作?你试过用“开始-结束”块吗
你读过这篇文章了吗?也许你有一个代替/for的触发器?您使用的是什么版本的MSSQL?您是否尝试过在没有数据库名称的情况下执行此操作?你试过用“开始-结束”块吗
你读过这篇文章吗?我知道这是一个旧线程,但我遇到了同样的问题,我通过进入XSD并在查询中,将查询的ExecuteMode从NonQuery更改为Scalar,设法解决了这个问题。这会阻止它始终返回1,而不是返回先前添加的行的ID
这可能是因为我后来试图将SELECT添加到INSERT中,而不是一次完成所有操作,UI为我正确地创建了它。我知道这是一个旧线程,但我也遇到了同样的问题,我通过进入XSD并在查询中解决了这个问题,将查询的ExecuteMode从NonQuery更改为Scalar。这会阻止它始终返回1,而不是返回先前添加的行的ID
这可能是因为我后来试图将SELECT添加到INSERT中,而不是一次完成所有操作并让UI为我正确地进行操作。我遇到了这个问题,我必须承认这是一个愚蠢的错误,但我认为这可能会发生在其他人身上。我使用的是返回受影响行数的Execute命令,而不是查询命令
顺便说一下,我在一个命令中将Insert和SELECT SCOPE_IDENTITY()组合在一起,这就是为什么我开始使用Execute命令。我仍然能够组合它们,但我使用了ExecuteScalar。我遇到了这个问题,我必须承认这是一个愚蠢的错误,但我认为这可能会发生在其他人身上。我使用的是返回受影响行数的Execute命令,而不是查询命令
顺便说一下,我在一个命令中将Insert和SELECT SCOPE_IDENTITY()组合在一起,这就是为什么我开始使用Execute命令。我仍然可以将它们组合起来,但我使用了ExecuteScalar。您是否检查过是否已将id键设置为主键?不确定这是否与您的场景相关,但我只是想知道所述表中的哪一列实际定义为“标识”列?如果在SQLServerManagementStudio中运行该列,它将失败。您是否在应用程序中运行此功能?请张贴所有涉及的代码。还指示定义为标识的列column@Nick.McDermaid-为什么它会在SSMS中失败?@Nick.McDermaid我将此查询用于vb.net TableAdapters。我的Primery键是带有标识规范的“ID”字段(不是EGelWeighingDataID字段)。我正在使用Sql Server Management Studio 2012。您是否检查过是否已将id键设置为主键?不确定这是否与您的场景相关,但只想知道您在所述表中实际将哪列定义为“标识”列?如果在Sql Server Management Studio中运行该列,则会失败。您是否在应用程序中运行此功能?请张贴所有涉及的代码。还指示定义为标识的列column@Nick.McDermaid-为什么它会在SSMS中失败?@Nick.McDermaid我将此查询用于vb.net TableAdapters。我的Primery键是带有标识规范的“ID”字段(不是EGelWeighingDataID字段)。我使用的是Sql Server Management Studio 2012。一个愚蠢的错误,对于使用ado.net的用户,必须执行Calar,Execute返回受影响的行数一个愚蠢的错误,对于使用ado.net的用户,必须执行Calar,Execute返回受影响的行数