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

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