如何获取SQL 2005和ASP中使用的下一个标识号?

时间:2008-11-19 16:35:09

标签: sql asp-classic ado identity autonumber

我之前通过执行如下简单查询来获取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,我需要它继续填写相关表格,将数据保存到相关表格并需要保存当前的记录号。

问题是,有没有办法在进行新插入时获得这个唯一编号?

3 个答案:

答案 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;
    }
}