복붙노트

[SQL] 어떻게 레코드를 삽입하고 하나의하는 SqlCommand를 사용하여 새로 생성 된 ID를 반환?

SQL

어떻게 레코드를 삽입하고 하나의하는 SqlCommand를 사용하여 새로 생성 된 ID를 반환?

나는 자동 생성 기본 키가있는 테이블에 레코드를 삽입하는 SqlCommand 개체를 사용하고 있습니다. 어떻게 내가 ExecuteScalar는 () 메서드를 사용할 때 내가 새로 만든 ID를 얻을 수 있도록 명령 텍스트를 쓸 수 있습니까?

해결법

  1. ==============================

    1.

    INSERT INTO YourTable(val1, val2, val3 ...) 
    VALUES(@val1, @val2, @val3...);
    SELECT SCOPE_IDENTITY();
    

    각 문장의 끝에 세미콜론을 잊지 마십시오.

  2. ==============================

    2.SQL 쿼리의 끝에 다음 줄을 추가 ...

    SQL 쿼리의 끝에 다음 줄을 추가 ...

    SELECT SCOPE_IDENTITY()
    

    그리고 다음 SqlCommand 개체의 ExecuteScalar는 방법을 사용하여 ...

    var rowCount = command.ExecuteScalar()
    
  3. ==============================

    3.

    insert into Yourtable()  
    values()  
    SELECT SCOPE_IDENTITY()
    

    난 그냥 테스트를 실행하고, 세미콜론은 선택 있다는 것을 확인하는 SQL 서버 2005 SP2를 사용하고 닷넷 3.5

  4. ==============================

    4.커맨드 객체로 출력 매개 변수를 추가하고 프로 시저의 새로운 ID에 값을 설정.

    커맨드 객체로 출력 매개 변수를 추가하고 프로 시저의 새로운 ID에 값을 설정.

    저장 프로 시저 :

    @ID AS INT OUTPUT
    
    [Insert Command]
    
    SET @ID = SCOPE_IDENTITY()
    

    .그물:

    cmd.CommandText = "stored_procedure";
    
    SqlParameter pID = new SqlParameter("ID", DBType.Int32, 4);
    
    pID.Direction = ParameterDirection.Output;
    
    cmd.ExecuteScalar();
    
    int id = Convert.ToInt32(cmd.Parameters["ID"].Value.ToString());
    
  5. ==============================

    5.@@ IDENTITY를 사용하지 마십시오, 그러나 단순하게 보일 수 있습니다. 그것은 잘못된 값을 반환 할 수 있습니다.

    @@ IDENTITY를 사용하지 마십시오, 그러나 단순하게 보일 수 있습니다. 그것은 잘못된 값을 반환 할 수 있습니다.

    SELECT SCOPE_IDENTITY()
    

    확실한 선택이 될 것으로 보인다.

  6. ==============================

    6.즉시 삽입 STMT, 사용 후

    즉시 삽입 STMT, 사용 후

    SELECT CAST(scope_identity() AS bigint) ---- incase you have a return result as int64
    

    이 열 생성 ID / ID를 반환합니다.

  7. ==============================

    7.월풀의 직선 아웃 :

    월풀의 직선 아웃 :

    과:

    편집 : 바와 같이 의견에서 지적, 당신은 항상 SCOPE_IDENTITY하지 @@ IDENTITY를 사용해야합니다.

  8. ==============================

    8.나는 데이브 마클의 대답처럼 (그리고 난 당신이 당신의 대답으로 표시 한 이후, 너무했다 참조)하지만, 당신이 당신의 데이터베이스에 트리거가있는 경우 그 방법은, 그 감사 CUD 작업을 수행하지 못할 수 있고, 사용자의 감사 테이블은 IDENTITY 열이 있습니다. 감사 테이블이 actualy 후 발생하기 때문에 그것은 감사 테이블의 ID의 값이 아닌 그냥 삽입 테이블을 반환합니다.

    나는 데이브 마클의 대답처럼 (그리고 난 당신이 당신의 대답으로 표시 한 이후, 너무했다 참조)하지만, 당신이 당신의 데이터베이스에 트리거가있는 경우 그 방법은, 그 감사 CUD 작업을 수행하지 못할 수 있고, 사용자의 감사 테이블은 IDENTITY 열이 있습니다. 감사 테이블이 actualy 후 발생하기 때문에 그것은 감사 테이블의 ID의 값이 아닌 그냥 삽입 테이블을 반환합니다.

    이 경우,보다 일반적인 방법에 상관없이 감사의 두 경우 모두에서 작동 할 수 있습니다. 그것보다 말의 비트,하지만 당신은 당신이 돈을받을.

    예:

    @"DECLARE @tmp AS TABLE ( id int )
                        INSERT INTO case
                        (
                            caseID,
                            partID,
                            serialNumber,
                            hardware,
                            software,
                            firmware
                        )
                        OUTPUT Inserted.ID into @tmp
                        VALUES
                        (
                            @caseID,
                            @partItemID,
                            @serialNumber,
                            @hardware,
                            @software,
                            @firmware
                        )
                    Select ID from @tmp" )
    
  9. ==============================

    9.당신의 ID가 GUID입니다 경우에, 나는 최선이 해결책을 발견 :

    당신의 ID가 GUID입니다 경우에, 나는 최선이 해결책을 발견 :

    INSERT INTO YourTable (val1, val2, val3) 
    OUTPUT inserted.id 
    VALUES (@val1, @val2, @val3)
    

    감사합니다 @Scott 아이비

    전체 데모 :

        internal static Guid InsertNote(Note note)
        {
                Guid id;
    
                using (
                    var connection =
                        new SqlConnection(ConfigurationManager.ConnectionStrings["dbconn"].ConnectionString))
                {
                    connection.Open();
                    using (
                        var command =
                            new SqlCommand(
                                "INSERT INTO Notes ([Title],[Text]) " +
                                "OUTPUT inserted.id " +
                                $"VALUES ('{title}','{text}');", connection))
                    {
                        command.CommandType = CommandType.Text;
                        var reader = command.ExecuteReader();
                        reader.Read();
                        id = reader.GetGuid(reader.GetOrdinal("id"));
                    }
                    connection.Close();
                }
    
                return id;
        }
    

    내가 저장 프로 시저를 사용하는 것이 좋습니다 것입니다, 그러나 이것은 우리의 저장소를 테스트하는 단위입니다.

  10. from https://stackoverflow.com/questions/330707/how-to-insert-a-record-and-return-the-newly-created-id-using-a-single-sqlcommand by cc-by-sa and MIT license