Sql-Server

為什麼SELECT @@IDENTITY 返回一個小數?

  • August 17, 2011

我正在使用Dapper從 ASP.NET MVC 3 (.NET 4.0) 應用程序對 SQL Server 2008 R2 Express 實例執行以下查詢。

INSERT INTO Customers (
        Type, Name, Address, ContactName, 
        ContactNumber, ContactEmail, Supplier)
VALUES (
        @Type, @Name, @Address, @ContactName, 
        @ContactNumber, @ContactEmail, @Supplier)

SELECT @@IDENTITY

呼叫connection.Query<int>(sql, ...)引發了無效的強制轉換異常。我已經對其進行了調試,它位於 Dapper 呼叫GetValue返回的SqlDataReader.

的返回類型GetValueObject,在調試器中檢查它顯示它是一個盒裝小數。

如果我將 select 更改為SELECT CAST(@@IDENTITY as int),則 GetValue 的返回是一個裝箱的 int 並且不會引發異常。

Id 列絕對是 int 類型;為什麼會SELECT @@IDENTITY返回小數?

一些附加資訊:

  • 數據庫是全新的。
  • 客戶表是我添加到其中的唯一對象。數據庫中沒有其他(使用者)表、視圖、觸發器或儲存過程。
  • 數據庫中有 10 行,ID 為 1,2,3,4,5,6,7,8,9,10(即列不超出 int 的限制)。

我的表定義是

CREATE TABLE [dbo].[Customers](
   [Id] [int] IDENTITY(1,1) NOT NULL,
   [Type] [int] NOT NULL,
   [Name] [nvarchar](255) NOT NULL,
   [Address] [nvarchar](1000) NOT NULL,
   [ContactName] [nvarchar](255) NOT NULL,
   [ContactNumber] [nvarchar](50) NOT NULL,
   [ContactEmail] [nvarchar](255) NOT NULL,
   [Supplier] [nvarchar](255) NOT NULL,
CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED 
(
   [Id] ASC
)WITH (
   PAD_INDEX  = OFF, 
   STATISTICS_NORECOMPUTE  = OFF, 
   IGNORE_DUP_KEY = OFF, 
   ALLOW_ROW_LOCKS  = ON, 
   ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
  1. @@identity 返回一個數字(38,0)。您需要將其轉換為 int。

SELECT CAST(@@identity AS INT) 2. 另外,請嘗試改用 scope_identity。如果您在客戶表上有任何觸發器,您最終可能會從另一個表中獲取最後一個身份。 3. 最後,由於您使用的是dapper,因此您需要將所有這些包裝在一個儲存過程中,以便保證您在同一批次中執行插入,然後對標識執行選擇。

從理論上講,它應該在大部分時間都可以自己執行這兩個操作。但是,如果您必須訪問數據庫兩次,則可能會出現問題。(例如,這如何與連接池一起工作?丟棄的連接呢?等等。)如果你只是把它全部放在一個儲存過程中,你就不必擔心以後的額外工作。

引用自:https://dba.stackexchange.com/questions/4696