【问题标题】:How to get the next identity number used in SQL Server 2005 and ASP?如何获取 SQL Server 2005 和 ASP 中使用的下一个标识号?
【发布时间】:2008-11-19 16:35:09
【问题描述】:

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

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

【问题讨论】:

    标签: sql-server asp-classic ado identity autonumber


    【解决方案1】:

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

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

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

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

    编辑

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

    【讨论】:

    • 这正是我需要的问题和答案。谢谢!
    【解决方案2】:

    SELECT CAST(Scope_Identity() AS INT)

    【讨论】:

      【解决方案3】:

      我知道这个问题很老了...但是您可以使用输出参数获取插入的记录 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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-14
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多