我之前通过执行如下简单查询来获取Access中使用的下一个可用自动编号:
SELECT RecordNumber, Info FROM myTABLE WHERE 0=1
这样我可以创建一个变量来保存currentRecord,并且它将使用Access在我更新行时将要使用的相同自动编号
实施例
rs.AddNew
currentRecord = rs("RecordNumber")
rsInfo = "SomeFormData" & currentRecord
rs.Update
rs.Close
现在这用于MS Access,但在SQL 2005中,我没有收回新记录创建的Identity。 “SomeFormData”已正确插入,SQL中的RecordNumber字段已填入新的自动编号,但我的变量中没有RecordNumber,我需要它继续填写相关表格,将数据保存到相关表格并需要保存当前的记录号。
问题是,有没有办法在进行新插入时获得这个唯一编号?
答案 0 :(得分:9)
IDENT_CURRENT('tableName')
(包括单引号)返回给定表的标识的当前值。此值应该是表中使用的最后分配的标识值。换句话说,除非该行已被删除,否则表中已有一行具有此标识值。将在下一个INSERT
分配的标识值为IDENT_CURRENT('tableName') + IDENT_INCR('tableName')
。
我不建议依赖于此。如果您以这种方式预先确定下一个标识值,那么您最终会遇到另一个进程使得插入实际上在您的ID之前获取该ID的情况,因此您的进程最终会使用错误的ID值。
最好先插入插件(即使您还没有所有数据),并使用SCOPE_IDENTITY()
来获取实际ID。
您可能想知道为什么SCOPE_IDENTITY()
优于IDENT_CURRENT('tableName')
。顾名思义,前者将为您提供在当前范围内分配的最新身份值(您的批次,存储过程,等等),而后者将为您提供由任何人分配在桌面上的最新身份。即使您可以在“IDENT_CURRENT
之后立即致电INSERT
,但仍有可能其他人的INSERT
出现在其中,IDENT_CURRENT
会为您提供由< em>他们的插入而不是你的插入,而SCOPE_IDENTITY
总会给你你的。
修改强>:
值得一提的是,SCOPE_IDENTITY()
比同样有效的@@IDENTITY
更受青睐。虽然两者都返回当前批次中指定的最新标识值,但@@IDENTITY
会受到触发器内插入的影响; SCOPE_IDENTITY()
不是。
答案 1 :(得分:1)
SELECT CAST(Scope_Identity()AS INT)
答案 2 :(得分:0)
我知道这个问题很旧...但是您可以使用输出参数来获取插入的记录ID。
这是我拥有的存储过程的一个例子
IF object_id('spOrganizationAdd') IS NOT NULL
DROP PROCEDURE spOrganizationAdd;
GO
CREATE PROCEDURE dbo.spOrganizationAdd
@OrganizationName VARCHAR(50),
@ReturnIdentityValue INT OUTPUT
AS
BEGIN
DECLARE @TempOrganizationIdentity TABLE (TempOrganizationID INT)
INSERT INTO Organization (OrganizationName)
OUTPUT INSERTED.OrganizationID INTO @TempOrganizationIdentity
VALUES (@OrganizationName)
SELECT @ReturnIdentityValue = (SElECT TempOrganizationID FROM @TempOrganizationIdentity)
END
GO
下面是一个调用它的C#代码示例...请注意ParameterDirection.Output
:
public static int AddOrganization(Organization oOrganization)
{
int iRetVal = 0;
using (SqlConnection conn = Connection.GetConnection())
{
using (SqlCommand cmd = new SqlCommand("spOrganizationAdd", conn))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@OrganizationName", oOrganization.OrganizationName);
cmd.Parameters.Add("@ReturnIdentityValue", SqlDbType.Int).Direction = ParameterDirection.Output;
conn.Open();
cmd.ExecuteNonQuery();
iRetVal = Convert.ToInt32(cmd.Parameters["@ReturnIdentityValue"].Value);
}
}
return iRetVal;
}
课程示例
public class Organization
{
public Organization() { }
public Organization(int organizationID) { OrganizationID = organizationID; }
public int OrganizationID { get; set; }
public string OrganizationName { get; set; }
public string Display()
{
return OrganizationID.ToString() + " " + OrganizationName;
}
}