none
Scope_Identity 와 관련되어 질문드립니다. RRS feed

  • 질문

  • 안녕하세요 쿼리문 작성 도중 어려움이 있어 질문드립니다.

    다름이 아니오라 생성되는 Scope_Identity() 값을 변수로 담아 그걸로 Insert를 하려고 하는데요

    Insert문이 2번 실행되어 2개의 값이 생성되었다는 가정하에 Identity의 값은 2개가 생성되었다고 생각했는데

    로그테이블에 Insert 시켜보니 1번만 Insert가 되더라구요.

    뭐가 문제인지 알 수가 없어서 질문남깁니다.

    생성되는 Scope_Identity() 값을 어떻게 하면 생성되는 수 만큼 변수로 담아 둘 수 있나요?

    2015년 5월 18일 월요일 오전 3:00

답변

  • Set @TestNo = parameter  <- 이부분을 바꿔가면서 INSERT ... SELECT 쿼리를 세번 호출한다는 의미인가요?

    Scope_Identity() 은 array가 아닙니다.

    따라서 마지막 호출된 insert 구문에서 생성된 identity 값만 가질 수 있습니다.

    각 INSERT 구문이 끝나자 마자 임시테이블이나 테이블면수에 scope_identity()의 값을 입력한 후, 필요할 때 SELECT 해서 처리하면 되지 않을까 싶습니다.

    CREATE TABLE #temp (id int)

    INSERT INTO V1 SELECT ... FROM V2 WHERE No = 1

    INSERT INTO #temp VALUES(SCOPE_IDENTITY())

    INSERT INTO V1 SELECT ... FROM V2 WHERE No = 2

    INSERT INTO #temp VALUES(SCOPE_IDENTITY())

    INSERT INTO V1 SELECT ... FROM V2 WHERE No = 3

    INSERT INTO #temp VALUES(SCOPE_IDENTITY())

    SELECT  id FROM #temp


    혹시 질문을 잘못 이해하고 있다면 덧글 달아주시고, scope_identity()를 사용하는 부분에 대해서도 코드에 설명을 해주면 질문을 이해하는데 도움이 될 듯 싶습니다.

    감사합니다.

    Younggun Kim

    MCDBA, MCITP
    Consultant @ Database Division in SQLRoad
    http://www.sqlroad.com  http://www.sqlserver.co.kr
    ygkim@sqlroad.com

    • 답변으로 표시됨 SK Y 2015년 5월 21일 목요일 오전 1:53
    2015년 5월 18일 월요일 오후 4:16

모든 응답

  • 안녕하세요.

    예를 들어서 아래와 같이 실행한다면, scope_identity()에는 두번재 쿼리에서 생성된 identity 값이 입력이 됩니다.

    insert ... values... -- 1번

    insert ... values... -- 2번

    set @id = scope_identity()

    scope_identity()나 @@identity는 바로 직전에 실행된 쿼리에서 생성된 identity 값을 갖게됩니다.

    따라서 각각의 insert문에 대한 identity 값을 변수에 담고 싶다면 insert 문 바로 다음에 scope_identity()를 변수에 담아서 사용해야 합니다.

    insert ... values... -- 1번

    set @id1 = scope_identity()

    insert ... values... -- 2번

    set @id2 = scope_identity()

    감사합니다.

    Younggun Kim

    MCDBA, MCITP
    Consultant @ Database Division in SQLRoad
    http://www.sqlroad.com  http://www.sqlserver.co.kr
    ygkim@sqlroad.com


    2015년 5월 18일 월요일 오전 7:56
  • Insert 문은 하나구요.. 던지는 변수가 여러개라 Insert가 여러번되는 구문입니다.

    예를들어

    Declare @TestNo Int

    Set @TestNo = parameter ( 1,2,3 -> 3가지를 던졌다고 가정 )

    insert into V1 (T1,T2,T3)

    SELECT T1 , T2 , T3

    FROM V2 WHERE No = @TestNo

    뭐 대충 이런 구조입니다. 1,2,3 즉 3번 insert 되는 구조이지요.

    방법이 없을까요?


    • 편집됨 SK Y 2015년 5월 18일 월요일 오전 9:19
    2015년 5월 18일 월요일 오전 9:16
  • Set @TestNo = parameter  <- 이부분을 바꿔가면서 INSERT ... SELECT 쿼리를 세번 호출한다는 의미인가요?

    Scope_Identity() 은 array가 아닙니다.

    따라서 마지막 호출된 insert 구문에서 생성된 identity 값만 가질 수 있습니다.

    각 INSERT 구문이 끝나자 마자 임시테이블이나 테이블면수에 scope_identity()의 값을 입력한 후, 필요할 때 SELECT 해서 처리하면 되지 않을까 싶습니다.

    CREATE TABLE #temp (id int)

    INSERT INTO V1 SELECT ... FROM V2 WHERE No = 1

    INSERT INTO #temp VALUES(SCOPE_IDENTITY())

    INSERT INTO V1 SELECT ... FROM V2 WHERE No = 2

    INSERT INTO #temp VALUES(SCOPE_IDENTITY())

    INSERT INTO V1 SELECT ... FROM V2 WHERE No = 3

    INSERT INTO #temp VALUES(SCOPE_IDENTITY())

    SELECT  id FROM #temp


    혹시 질문을 잘못 이해하고 있다면 덧글 달아주시고, scope_identity()를 사용하는 부분에 대해서도 코드에 설명을 해주면 질문을 이해하는데 도움이 될 듯 싶습니다.

    감사합니다.

    Younggun Kim

    MCDBA, MCITP
    Consultant @ Database Division in SQLRoad
    http://www.sqlroad.com  http://www.sqlserver.co.kr
    ygkim@sqlroad.com

    • 답변으로 표시됨 SK Y 2015년 5월 21일 목요일 오전 1:53
    2015년 5월 18일 월요일 오후 4:16
  • 답변감사합니다. 다만 웹에서 쿼리문이 짜여져 있는걸 돌리는거라 답변주신 내용을 힌트로 다르게 구현하였습니다.

    감사합니다 즐거운 하루되세요 ^^

    2015년 5월 21일 목요일 오전 1:54