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.ExecuteScalar
和Sqlserver
的SCOPE_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