programing

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

iphone6s 2023. 9. 9. 09:10
반응형

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

자동 생성된 기본 키가 있는 테이블에 레코드를 삽입하기 위해 SQLCommand 개체를 사용하고 있습니다.ExecuteScalar() 메서드를 사용할 때 새로 생성된 ID를 가져오도록 명령 텍스트를 작성하려면 어떻게 해야 합니까?

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

각 문장 끝에 있는 세미콜론을 잊지 마세요.

SQL 쿼리 끝에 다음 행 추가...

SELECT SCOPE_IDENTITY()

그런 다음 SqlCommand 개체에서 ExecuteScalar 메서드를 사용합니다.

var rowCount = command.ExecuteScalar()
insert into Yourtable()  
values()  
SELECT SCOPE_IDENTITY()

방금 테스트를 실행하여 SQL Server 2005 SP2 및 를 사용하여 세미콜론이 옵션인지 확인했습니다.순 3.5

명령 개체에 출력 파라미터를 추가한 다음 저장 프로시저에서 새 ID로 값을 설정합니다.

저장 프로시저:

@ID AS INT OUTPUT

[Insert Command]

SET @ID = SCOPE_IDENTITY()

.NET:

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());

@@IDENTITY를 사용하지 마십시오.잘못된 값을 반환할 수 있습니다.

SELECT SCOPE_IDENTITY()

당연한 선택인 것 같습니다

Dave Markle의 답변이 마음에 들기는 하지만(답변으로 표시하셨기 때문에), 데이터베이스에 트리거가 있고 CUD 작업을 감사하며 감사 테이블에 IDENTITY 열이 있다면 이 방법은 실패할 수 있습니다.감사 테이블이 실제로 다음에 발생하므로 방금 삽입한 테이블이 아닌 감사 테이블의 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" )

삽입 stmt 직후 사용

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

이렇게 하면 생성된 열 ID/ID가 반환됩니다.

ID가 Guid이면 이 솔루션이 가장 좋습니다.

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

Thanks @Scott Ivey

전체 데모:

    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;
    }

저장 프로시저를 사용하는 것을 권장하지만, 이는 당사 저장소의 단위 테스트를 위한 것입니다.

월풀에서 바로 탈출하는 방법:

MS SQL을 사용하는 경우 삽입 후 "SELECT @@IDENTITY as Value"를 사용하여 마지막 ID를 생성할 수 있습니다.

그리고:

@@IDENTITY그리고.SCOPE_IDENTITY현재 세션의 테이블에서 생성된 마지막 ID 값을 반환합니다.하지만,SCOPE_IDENTITY현재 범위 내에서만 값을 반환합니다.@@IDENTITY특정 범위에 국한되지 않습니다.

편집 : 댓글에 지적된 것처럼 항상 다음을 사용해야 합니다.SCOPE_IDENTITY,것은 아니다.@@IDENTITY.

언급URL : https://stackoverflow.com/questions/330707/how-to-insert-a-record-and-return-the-newly-created-id-using-a-single-sqlcommand

반응형