[SQL] 어떻게 레코드를 삽입하고 하나의하는 SqlCommand를 사용하여 새로 생성 된 ID를 반환?
SQL어떻게 레코드를 삽입하고 하나의하는 SqlCommand를 사용하여 새로 생성 된 ID를 반환?
나는 자동 생성 기본 키가있는 테이블에 레코드를 삽입하는 SqlCommand 개체를 사용하고 있습니다. 어떻게 내가 ExecuteScalar는 () 메서드를 사용할 때 내가 새로 만든 ID를 얻을 수 있도록 명령 텍스트를 쓸 수 있습니까?
해결법
-
==============================
1.
INSERT INTO YourTable(val1, val2, val3 ...) VALUES(@val1, @val2, @val3...); SELECT SCOPE_IDENTITY();
각 문장의 끝에 세미콜론을 잊지 마십시오.
-
==============================
2.SQL 쿼리의 끝에 다음 줄을 추가 ...
SQL 쿼리의 끝에 다음 줄을 추가 ...
SELECT SCOPE_IDENTITY()
그리고 다음 SqlCommand 개체의 ExecuteScalar는 방법을 사용하여 ...
var rowCount = command.ExecuteScalar()
-
==============================
3.
insert into Yourtable() values() SELECT SCOPE_IDENTITY()
난 그냥 테스트를 실행하고, 세미콜론은 선택 있다는 것을 확인하는 SQL 서버 2005 SP2를 사용하고 닷넷 3.5
-
==============================
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.@@ IDENTITY를 사용하지 마십시오, 그러나 단순하게 보일 수 있습니다. 그것은 잘못된 값을 반환 할 수 있습니다.
@@ IDENTITY를 사용하지 마십시오, 그러나 단순하게 보일 수 있습니다. 그것은 잘못된 값을 반환 할 수 있습니다.
SELECT SCOPE_IDENTITY()
확실한 선택이 될 것으로 보인다.
-
==============================
6.즉시 삽입 STMT, 사용 후
즉시 삽입 STMT, 사용 후
SELECT CAST(scope_identity() AS bigint) ---- incase you have a return result as int64
이 열 생성 ID / ID를 반환합니다.
-
==============================
7.월풀의 직선 아웃 :
월풀의 직선 아웃 :
과:
편집 : 바와 같이 의견에서 지적, 당신은 항상 SCOPE_IDENTITY하지 @@ IDENTITY를 사용해야합니다.
-
==============================
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.당신의 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; }
내가 저장 프로 시저를 사용하는 것이 좋습니다 것입니다, 그러나 이것은 우리의 저장소를 테스트하는 단위입니다.
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
'SQL' 카테고리의 다른 글
[SQL] JDBC 더비 드라이버를 찾을 수 없습니다 (0) | 2020.06.04 |
---|---|
[SQL] Yii2와 액티브를 사용하여 실제 SQL 쿼리를 로그? (0) | 2020.06.04 |
[SQL] 어떻게 무시하는 "중복 키"T-SQL의 오류 (SQL 서버) (0) | 2020.06.04 |
[SQL] 어떻게 PostgreSQL을에있는 테이블의 목록 열 이름과 데이터 유형을 얻으려면? (0) | 2020.06.04 |
[SQL] 당신은 어떻게 T-SQL에서 기본 값 또는 유사한 제약 조건을 삭제합니까? (0) | 2020.06.04 |