sqlserver insert同时返回新插入行自增ID的值

SQL插入与主键返回
本文介绍了一种在SQL Server中执行插入操作并返回自动生成的主键的方法。通过使用SqlCommand对象结合SqlConnection进行数据库交互,利用ExecuteScalar方法获取由SCOPE_IDENTITY()返回的最新插入记录的主键。

string strSql = "insert into table(a,b,c) values('1','2','3')   SELECT SCOPE_IDENTITY();"

查询:

 //存入数据库
    public static int operateSqlServerDbAndReturnPrimaryKey(string strSql)
    {
        //update,insert,delete 


        SqlConnection conn = DB.getConnection();


        SqlCommand sqlcmd = new SqlCommand(strSql, conn);
        if (conn.State != ConnectionState.Open)
        {
            conn.Open();
        }
        int rtn = Convert.ToInt32(sqlcmd.ExecuteScalar());
        conn.Close();
        sqlcmd.Dispose();


        return rtn;
    }

在 SQL Server 中,当插入一条记录到具有自主键(Identity)的表时,可以通过以下方法获取刚插入记录的主键 ID: ### 1. 使用 `@@IDENTITY` 函数 `@@IDENTITY` 是 SQL Server 提供的一个系统函数,用于返回当前会话中最后一次插入的自 ID 。该不受作用域限制,可能会受到触发器等其他操作的影响[^1]。 示例: ```sql INSERT INTO YourTable (Column1, Column2) VALUES ('Value1', 'Value2'); SELECT @@IDENTITY AS InsertedID; ``` ### 2. 使用 `OUTPUT INSERTED` 子句 `OUTPUT INSERTED` 是一种更精确的方法,可以返回插入记录的指定列(包括自 ID)。该方法不受其他会话或触发器操作的影响,因此推荐在需要精确控制返回的场景中使用。 示例: ```sql DECLARE @InsertedIDs TABLE (ID INT); INSERT INTO YourTable (Column1, Column2) OUTPUT INSERTED.ID INTO @InsertedIDs VALUES ('Value1', 'Value2'); SELECT ID FROM @InsertedIDs; ``` ### 3. 使用 `SCOPE_IDENTITY()` 函数 `SCOPE_IDENTITY()` 与 `@@IDENTITY` 类似,但其作用范围限定在当前会话和当前作用域内,避免了触发器等外部影响,因此在多用户环境下更加可靠。 示例: ```sql INSERT INTO YourTable (Column1, Column2) VALUES ('Value1', 'Value2'); SELECT SCOPE_IDENTITY() AS InsertedID; ``` ### 4. 在 ADO.NET 或 ORM 框架中获取自 ID 在使用 ADO.NET 或 ORM 框架(如 MyBatis、MyBatis-Plus 等)时,可以通过配置方式获取插入后的自 ID。例如: #### ADO.NET 中使用 `ExecuteScalar` ```csharp string query = "INSERT INTO YourTable (Column1, Column2) VALUES (@Value1, @Value2); SELECT SCOPE_IDENTITY();"; using (SqlCommand cmd = new SqlCommand(query, connection)) { cmd.Parameters.AddWithValue("@Value1", "Value1"); cmd.Parameters.AddWithValue("@Value2", "Value2"); int insertedId = Convert.ToInt32(cmd.ExecuteScalar()); } ``` #### MyBatis 配置方式 在 MyBatis 中,可以通过 XML 配置或注解方式启用自动返回主键功能[^2]。 XML 配置示例: ```xml <insert id="InsertPerson" parameterType="Person" useGeneratedKeys="true" keyProperty="id" keyColumn="id"> INSERT INTO Person (Name, Age) VALUES (#{name}, #{age}) </insert> ``` 注解方式示例: ```java @Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id") @Insert("INSERT INTO Person (Name, Age) VALUES (#{name}, #{age})") void insertPerson(Person person); ``` ### 5. 批量插入时的处理 在 SQL Server 中,批量插入时获取所有插入记录的自 ID 存在限制。由于 JDBC 驱动仅支持返回最后一个插入记录的 ID,无法像 MySQL 那样支持批量回写主键[^3]。因此,批量插入时建议使用以下方法: - **逐条插入并获取 ID**:适用于数据量较小的情况。 - **使用 `OUTPUT` 子句结合临时表**:适用于数据量较大的情况。 示例: ```sql DECLARE @InsertedIDs TABLE (ID INT); INSERT INTO YourTable (Column1, Column2) OUTPUT INSERTED.ID INTO @InsertedIDs SELECT 'Value1', 'Value2' UNION ALL SELECT 'Value3', 'Value4'; SELECT ID FROM @InsertedIDs; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值