SCOPE_IDENTITY()知識

SCOPE_IDENTITY()取得返回在當前會話中的任何表內所生成的最後一個標識值
比如新增一條記錄,獲得插入記錄的ID號

var pramTotalRowCount = new SqlParameter("@PKID", SqlDbType.Int) { Direction = ParameterDirection.Output };
var parameters = new[]
{
    new SqlParameter("@ID", srcs.ShopID),
    new SqlParameter("@Name", srcs.UserName),
    pramTotalRowCount
};
 string sql = @"INSERT  INTO Tuhu_shop..ShopReceiveCheckSecond
                ( ID ,
                  Name
                )
                VALUES  ( @ID , 
                  @Name);
            SET @PKID = SCOPE_IDENTITY();";
SqlHelper.ExecuteNonQuery(connection, CommandType.Text, sql, parameters);
long pkid = 0;
long.TryParse(pramTotalRowCount.Value.ToString(), out pkid);
return pkid;

C# dapper 返回Sql server 自增長ID 標識列SCOPE_IDENTITY

SQL獲取剛插入的記錄的自動增長列ID的值

CREATE TABLE [dbo].[MesTest](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [Msg] [nvarchar](500) NULL
) ON [PRIMARY]
 [TestMethod]
        public void TestMethod1()
        {
            var sql = "INSERT INTO [MesTest] ([Msg]) VALUES('ss');SELECT @id=SCOPE_IDENTITY()";
            using (var db = Database.DbService)
            {
                var p = new DynamicParameters();
                p.Add("@ID", dbType: DbType.Int32, direction: ParameterDirection.Output);
                var i = db.Execute(sql,p);
                var i1 = p.Get<int>("@ID");
               
                Assert.Inconclusive(i1.ToString());
            }
        }

SqlCommand.ExecuteScalarSqlserverSCOPE_IDENTITY()函數

在數據庫應用中,比較常見一個操作就是插入一條數據到包含自動增加ID字段的表中,並要獲取插入數據的ID值,sql的insert語句屬於無返回值的操作,如何才能獲取最後插入的數據的ID值?在微軟的MSDN中有一個例子,使用了SqlCommand.ExecuteScalar()方法和SqlServer中的scope_identity()函數。

ExecutedScalar()方法功能爲:執行查詢,並返回查詢所返回的結果集中第一行的第一列,忽略其他列或行。

scope_identity()函數在聯機手冊中的描述:返回插入到同一作用域中的標識列內的最後一個標識值。一個範圍是一個模塊:存儲過程、觸發器、函數或批處理。因此,如果兩個語句處於同一個存儲過程、函數或批處理中,則它們位於相同的作用域中。

下面的示例創建一個 SqlCommand,然後使用 ExecuteScalar 執行它。向該示例傳遞兩個字符串,一個字符串表示要插入到表中的新值,另一個字符串用於連接至數據源。如果已插入新行,則此函數會返回新的“Identity”列值,如果失敗,則返回 0

static public int AddProductCategory(string newName, string connString)
{
    Int32 newProdID = 0;
    string sql = "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); " + "SELECT CAST(scope_identity() AS int)";
    using(SqlConnection conn = new SqlConnection(connString))
    {
        SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.Parameters.Add("@Name", SqlDbType.VarChar);
        cmd.Parameters["@name"].Value = newName;
        try
        {
            conn.Open();
            newProdID = (Int32) cmd.ExecuteScalar();
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    return(int) newProdID;
}

SCOPE_IDENTITY的用法

SCOPE_IDENTITY@@IDENTITY的作用都是取得返回在當前會話中的任何表內所生成的最後一個標識值,簡單的說就是在執行一條插入語句之後使用@@IDENTITY的全局變量,取得插入記錄的ID號但是有個問題就是,@@IDENTITY是全局的,所以在他的功能會體現在所有作用域,一個操作,一個觸發器,一個存儲過程叫做一個作用域,這時候如果出現多個作用域的情況的時候,@@IDENTITY所取得的ID號就是最後一個作用域產生的結果。這時候我們要使用SCOPE_IDENTITY方法來作了。SCOPE_IDENTITY只返回插入到當前作用域中的值;@@IDENTITY 不受限於特定的作用域。

使用方法:

select   SCOPE_IDENTITY()   as   ID   from   [table]select   @@IDENTITY   as   ID   from   [table]   

實例:

sql="SET   NOCOUNT   ON;insert   into   [Table](Item)   values('"&Item&"')"sql=sql&";select   @@IDENTITY   as   ID   from   [Table];SET   NOCOUNT   OFF;"   

在插入某些自增表的時候,需要將其打開:
語法:SET IDENTITY_INSERT TableName ON

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章