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