【问题标题】:SCOPE_IDENTITY() returns thousand numberSCOPE_IDENTITY() 返回千数
【发布时间】:2018-02-19 11:08:31
【问题描述】:

我有一个插入查询,如下所示。但是,scopeIdentity 不返回 42,而是返回 1042。

这是 SQL Server 表:

我的代码:

int masterId = 0;

using (SqlConnection cmd = new SqlConnection(connString))
{
    using (SqlCommand conn = cmd.CreateCommand())
    {
        conn.CommandText = "INSERT INTO[MasterReportData]([ReportName],[CaseList],[EmployeeId],[datetime]) VALUES(@reportName, @caseList, @employeeId, @datetime) SET @ID = SCOPE_IDENTITY()";

        conn.Parameters.Add("@reportName", SqlDbType.VarChar).Value = reportName;
        conn.Parameters.Add("@caseList", SqlDbType.VarChar).Value = caseList;
        conn.Parameters.Add("@employeeId", SqlDbType.Char).Value = employeeId;
        conn.Parameters.Add("@datetime", SqlDbType.DateTime).Value = datetime;
        conn.Parameters.Add("@ID", SqlDbType.Int).Direction = ParameterDirection.Output;

        cmd.Open();
        conn.ExecuteNonQuery();

        masterId = Convert.ToInt32(conn.Parameters["@ID"].Value);
        cmd.Close();
    }
}

【问题讨论】:

  • 缺少分号; ?为什么你认为它应该返回 42?即使最后一行是“41”,回滚插入或删除也可能导致计数器前进
  • 那么,如果您查看数据库,实际插入了什么值?标识列中 1000 的跳跃相当普遍(自 2012 年以来,IIRC),无论如何,如果您关心 实际数值,我建议您使用错误的标识。
  • SELECT IDENT_CURRENT('MasterReportData')检查您在此表上的身份列的当前值 - 它返回什么?
  • @marc_s SELECT IDENT_CURRENT('MasterReportData') 返回 1042
  • 这样你就有了 - 你的身份列的当前值 IS 实际上是 1042 - 代码工作正确 - 没有错误

标签: c# sql-server insert scope-identity


【解决方案1】:

看看https://docs.microsoft.com/en-us/sql/t-sql/functions/scope-identity-transact-sql

描述说: 返回插入到同一范围内的标识列中的最后一个标识值。范围是一个模块:存储过程、触发器、函数或批处理。因此,如果两条语句在同一个存储过程、函数或批处理中,它们就在同一个作用域内。

换句话说:它返回最后一个 id 而不是下一个要使用的。因此,您不能像那样使用 INSERT 命令。你可以做的是:

将您的 ID 配置为自动递增 ID。然后运行 ​​INSERT 命令,然后运行 ​​SELECT SCOPE_IDENTITY() 以找出使用的 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    相关资源
    最近更新 更多