5

我之前通过执行如下简单查询获得了 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 Server 2005 中,我没有取回由新记录创建的标识。“SomeFormData”已正确插入,SQL 中的 RecordNumber 字段由新的自动编号填充,但我的变量中没有 RecordNumber,我需要它继续填写相关表单,将数据保存到相关表并需要保存当前记录编号。

问题:有没有办法在进行新插入时取回这个唯一编号?

4

3 回答 3

10

IDENT_CURRENT('tableName')(包括单引号)返回给定表的标识的当前值。该值应该是表中使用的最后分配的标识值。换句话说,除非该行已被删除,否则您将在表中拥有具有此标识值的行。将在下一次分配的标识值INSERT将是IDENT_CURRENT('tableName') + IDENT_INCR('tableName')

不过,我不建议依赖这个。如果您以这种方式预先确定下一个标识值,那么您最终会遇到这样的情况,即另一个进程在您之前插入实际获取该 ID 的插入,因此您的进程最终使用了错误的 ID 值。

最好先进行插入(即使您还没有所有数据),并用于SCOPE_IDENTITY()获取分配的实际 ID。

你可能想知道为什么SCOPE_IDENTITY()IDENT_CURRENT('tableName'). 顾名思义,前者将为您提供在当前范围内分配的最新身份值(您的批次、您的存储过程等),而后者将为您提供任何人在表上分配的最新身份。即使您可能会IDENT_CURRENT在 ' 之后立即调用INSERT,但仍有可能INSERT在两者之间出现其他人,并且会为您提供由他们的插入而不是您的插入IDENT_CURRENT产生的身份值,而总是给您您的。SCOPE_IDENTITY

编辑

还值得一提的SCOPE_IDENTITY()是,它比功能相似的@@IDENTITY. 虽然两者都返回当前批次中分配的最新标识值,但@@IDENTITY受触发器中发生的插入影响;SCOPE_IDENTITY()不是。

于 2008-11-19T16:52:45.487 回答
1

SELECT CAST(Scope_Identity()作为 INT)

于 2008-11-19T16:40:31.080 回答
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;
    }
}
于 2019-11-26T04:21:22.297 回答