복붙노트

[SQL] 삽입 후 새로운 ID를 얻기

SQL

삽입 후 새로운 ID를 얻기

나는 다음과 같이 정의 된 테이블에 새로운 행의 무리를 삽입하고 있습니다 :

CREATE TABLE [sometable](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [someval] sometype NOT NULL
)

다음 삽입을 사용하여 :

insert into sometable select somefield as someval from othertable

내가 완료 한 때, 나는 모든 새로 삽입 된 행의 ID를 알고 싶습니다. SCOPE_IDENTITY는 ()는 마지막 행이 삽입 된 ID를 반환합니다.

어떻게 모든 새로운 ID를받을 수 있나요?

마음에 스프링 sometable와 SCOPE_IDENTITY () 후 삽입에서 현재 가장 큰 정체성을 잡은 sometable에서 선택이 두 값을 사용하는 것이 한 가지 방법. 예를 들면 :

declare @currentMaxId int;
select @currentMaxId=MAX(id) from sometable
insert into sometable select somefield as someval from othertable
select * from sometable where id>@currentMaxId and id<=SCOPE_IDENTITY()

더 나은 패턴이 있습니까?

해결법

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

    1.모든 테이블에 삽입 된 아이디 다시 잡아 출력 기능을 사용합니다.

    모든 테이블에 삽입 된 아이디 다시 잡아 출력 기능을 사용합니다.

    CREATE TABLE MyTable
    (
        MyPK INT IDENTITY(1,1) NOT NULL,
        MyColumn NVARCHAR(1000)
    )
    
    DECLARE @myNewPKTable TABLE (myNewPK INT)
    
    INSERT INTO 
        MyTable
    (
        MyColumn
    )
    OUTPUT INSERTED.MyPK INTO @myNewPKTable
    SELECT
        sysobjects.name
    FROM
        sysobjects
    
    SELECT * FROM @myNewPKTable
    
  2. ==============================

    2.그리고 당신은 ADO.Net에서 "컨트롤"을 원하고 ID를 차일에 할당받을 당신이 모델을 업데이트 할 수 있도록 다시 ID를 얻는 경우 : http://daniel.wertheim.se/2010/10/24/c-batch-identity-inserts/

    그리고 당신은 ADO.Net에서 "컨트롤"을 원하고 ID를 차일에 할당받을 당신이 모델을 업데이트 할 수 있도록 다시 ID를 얻는 경우 : http://daniel.wertheim.se/2010/10/24/c-batch-identity-inserts/

  3. ==============================

    3.사용이 저장 프로 시저

    사용이 저장 프로 시저

    이것은 동적 주키 될 것이다 ..

    SET QUOTED_IDENTIFIER ON 가다 SET ANSI_NULLS ON 가다

    절차 sp_BulkInsertCountry을 CREATE ( @FilePath의 VARCHAR (1000) ) 같이 BEGIN - 절차를 --variable 선언 선언 @SQL의 VARCHAR (500) @id INT 선언 선언 @CountryName의 VARCHAR (30)

    국가 --create 임시 테이블 표 #tmpCountry을 CREATE ( COUNTRYNAME의 VARCHAR (30) )

    --- 임시 테이블에 대량 삽입을 실행 SQL @ SET = '에서 BULK INSERT #tmpCountry' ''+ @FilePath + '' 'WITH (FIELDTERMINATOR =' ',' ', ROWTERMINATOR =' '\ n'을 ')' EXEC (@Sql)

    cursor_Country 커서 READ_ONLY을위한 선언 #tmpCountry에서 [COUNTRYNAME]를 선택한

    OPEN cursor_Country cursor_Country INTO @CountryName로부터 다음을 FETCH @@ FETCH_STATUS = 0 WHILE BEGIN tblCountryMaster로부터 SELECT @ ID = ISNULL (최대 (Countryid), 0) SET @ ID = @ ID + 1 INSERT INTO tblCountryMaster 값 (ID @ @ COUNTRYNAME) cursor_Country INTO @CountryName로부터 다음을 FETCH 종료 CLOSE cursor_Country DEALLOCATE cursor_Country END - 절차

    가다 SET QUOTED_IDENTIFIER OFF 가다 SET ANSI_NULLS ON 가다

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

    4.모든 새로운 ID를 설정하는 테이블을 만듭니다. 모든 삽입에 대한 루프를 확인합니다. 루프 내부에 SCOPE_IDENTITY와 당신이 원하는 삽입을 (). 삽입 후 새 ID를 얻을 당신이 만든 새 테이블에 삽입합니다. [newTable]의 단부 * 선택한다.

    모든 새로운 ID를 설정하는 테이블을 만듭니다. 모든 삽입에 대한 루프를 확인합니다. 루프 내부에 SCOPE_IDENTITY와 당신이 원하는 삽입을 (). 삽입 후 새 ID를 얻을 당신이 만든 새 테이블에 삽입합니다. [newTable]의 단부 * 선택한다.

  5. from https://stackoverflow.com/questions/810962/getting-new-ids-after-insert by cc-by-sa and MIT license