2017-09-11 74 views
0

我有一個插入查詢,如下所示。然而,scopeIdentity不返回42,它返回1042SCOPE_IDENTITY()返回千位數

這是SQL Server表:

enter image description here

我的代碼:

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(); 
    } 
} 
+0

缺少分號; ?你爲什麼認爲它應該返回42?即使最後一行是'41',回滾插入或刪除可能導致計數器前進 –

+4

因此,如果您查看數據庫,實際插入了什麼值?在身份欄中跳轉1000次相當常見(自2012年起,IIRC),無論如何,如果您關心*實際數值*,我建議您使用身份錯誤。 –

+0

使用以下命令檢查您的標識列的當前值:'SELECT IDENT_CURRENT('MasterReportData')' - 它返回什麼? –

回答

0

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

描述說: 返回最後的標識值插入同一範圍內的標識列中。範圍是一個模塊:存儲過程,觸發器,函數或批處理。因此,如果兩個語句處於相同的存儲過程,函數或批處理中,它們處於相同的範圍內。

言辭:它返回最後一個ID,而不是下一個使用。因此,您不能像這樣使用INSERT命令。你可以做的是:

配置你的ID爲自動增量ID。然後運行INSERT命令,然後運行SELECT SCOPE_IDENTITY()以查明使用了哪個ID。