Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Truy xuất ID được chèn gần đây nhất bằng scope_Identity ()

Bạn không nên tách truy vấn thành hai truy vấn. Bạn nên chọn / đặt kết quả trong truy vấn chèn.

Tôi đã làm một ví dụ cho bạn:

Phương thức đầu tiên trả về một giá trị duy nhất bằng cách sử dụng select

private void Method1()
{
    string sEmail = "[email protected]";
    string passwordHash = "#[email protected]#[email protected]!#@[email protected]#!#@$!#@$!";
    string salt = "????";
    string sName = "John";

    using (SqlConnection sqlConnection = new SqlConnection(_connectionString))
        try
        {
            sqlConnection.Open();

            string insertStatement = "INSERT INTO [User] "
                                        + "(email, hash, salt, name) "
                                        + "VALUES (@email, @hash, @salt, @name)"

                                        + "SELECT SCOPE_IDENTITY()";

            using (SqlCommand insertCommand = new SqlCommand(insertStatement, sqlConnection))
            {

                insertCommand.Parameters.Add("@email", SqlDbType.VarChar, 50).Value = sEmail;
                insertCommand.Parameters.Add("@hash", SqlDbType.VarChar, 50).Value = passwordHash;
                insertCommand.Parameters.Add("@salt", SqlDbType.VarChar, 50).Value = salt;
                insertCommand.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = sName;


                int userId = Convert.ToInt32(insertCommand.ExecuteScalar());
                Trace.WriteLine("User created with id: " + userId);
            }
        }

        catch (SqlException ex)
        {
            Trace.WriteLine(ex.Message);
            //lblMessage.Text = ex.Message;
        }
}

Phương pháp thứ hai là xác định một tham số đầu ra, theo cách này, bạn có thể trả về nhiều giá trị.

private void Method2()
{
    string sEmail = "[email protected]";
    string passwordHash = "#[email protected]#[email protected]!#@[email protected]#!#@$!#@$!";
    string salt = "????";
    string sName = "John";

    using (SqlConnection sqlConnection = new SqlConnection(_connectionString))
        try
        {
            sqlConnection.Open();

            string insertStatement = "INSERT INTO [User] "
                                        + "(email, hash, salt, name) "
                                        + "VALUES (@email, @hash, @salt, @name)"

                                        + "SET @user_id = SCOPE_IDENTITY()";

            using (SqlCommand insertCommand = new SqlCommand(insertStatement, sqlConnection))
            {

                insertCommand.Parameters.Add("@email", SqlDbType.VarChar, 50).Value = sEmail;
                insertCommand.Parameters.Add("@hash", SqlDbType.VarChar, 50).Value = passwordHash;
                insertCommand.Parameters.Add("@salt", SqlDbType.VarChar, 50).Value = salt;
                insertCommand.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = sName;

                insertCommand.Parameters.Add("@user_id", SqlDbType.Int).Direction = ParameterDirection.Output;

                insertCommand.ExecuteNonQuery();

                int userId = Convert.ToInt32(insertCommand.Parameters["@user_id"].Value);
                Trace.WriteLine("User created with id: " + userId);
            }
        }

        catch (SqlException ex)
        {
            Trace.WriteLine(ex.Message);
            //lblMessage.Text = ex.Message;
        }
}

Điều tốt nhất bạn có thể làm là, nếu các truy vấn là tĩnh, đặt các truy vấn này trong các thủ tục được lưu trữ. Điều này sẽ tăng tốc các truy vấn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. tạo / cập nhật chế độ xem bằng cách sử dụng quy trình được lưu trữ

  2. băm một hàng SQL?

  3. Các ký tự không in được trong đầu ra bcp.exe

  4. Mức độ ưu tiên của một truy vấn trong MS SQL

  5. SQL Server 2012:tính tổng theo thứ tự do đưa ra lỗi Cú pháp không chính xác gần 'order'