2017-12-01 3 views
0

내가 루프에서 시도에 삽입] T2 모든 행되지 T2

난에서 코드를 생성하고 같이 T2에서 현재 사용하지 않는 T2에 T1의 모든 레코드를 삽입하려고에서 T2

declare  @Part   VARCHAR(255), 
      @GenValue  VARCHAR(255), 
      @x    INT 
set @x = (select count(*) from T1) 
WHILE @x >=0 

BEGIN 
    EXEC [dbo].[usp_GenInd] @GenValue OUT,@GencCode = 'TKM', @GencIncrement = 1 


    set @Part = @GencValue 

    INSERT INTO dbo.T2 
    SELECT @Part       AS [part], 
      [Prod_Code] + Column_Header  AS [identifier], 
      [part_rev]      = NULL, 
      '!'        AS [u_version], 
      a.[Descr]       AS [descr], 
      GETDATE()      AS [last_updated], 
      'ME'       AS [last_upd_user], 
      'EA'       AS [basic_unit], 
      [source]      = NULL, 
      'MAIN'       AS [level_1], 
      'GROUP'       AS [level_2], 
      'ME'       AS [user_created], 
      '20'       AS [status], 
      [Prod_Code]      AS [master_part], 
      [drawing_no]     = NULL 

    FROM [dbo].T1 a 
    LEFT JOIN dbo.T2 b 
     ON a.Prod_Code + a.Column_Header = b.part 
    WHERE b.part is null 

END 

의 식별자로 저장된 프로 시저 나는 내가 저장된 프로 시저에서 발생하고있는 @part 변수입니다 T2에 기본 키 위반 말을 점점 오류를 유지.

실제로 느린뿐만 아니라 null보다 왼쪽 커서가 커서보다 빠르다고 생각했습니다.

는 T1에

+0

왜이 값을 저장 프로 시저에서 생성해야합니까? 디자인에서는 기본 키의 일부를 생성하기 위해 스토어드 프로 시저를 호출해야하므로 걸려있다. 나는 그것이 아주 좋은 디자인 선택이 아니라고 말해야 만합니다. –

+0

@SeanLange에 동의합니다. 단순한 디자인은 주요 위반 사항을 제거해야합니다. 이미 존재하지 않는 레코드를 삽입하는 일반적인 개념은 MERGE 명령을 제안합니다. 초고속이며 이와 비슷한 것을 위해 설계되었습니다. 테이블 디자인 및 사용 사례에 대한 구체적인 내용이 없으므로 '큰 그림'을하려고하는 것이 너무 어렵 기 때문에 답변을 게시하지 않습니다. –

답변

1

아니 - 당신은이를 계속해야하는 경우 다시 커서를 이동 저장 프로 시저를 사용하여 기본 키 값을 생성합니다. 이 스크립트에 추가 한 논리 오류는 insert 문입니다. 그것은 T1에서 특정 행을 선택하지 않습니다 - 그것은 T2에 존재하지 않는 T1의 모든 행을 선택합니다 (논리가 맞다고 가정 - 그것을 평가하지 않을 것입니다). 아마도 T1의 각 행에 대해 PK 값을 생성하려면 usp_GenInd 프로 시저를 호출해야합니다. 또한, @x를 감소시키지 않으므로 무한 루프가 가능합니다.

그리고 "존재하지 않음"이라는 문구를 주목하십시오. 일반적으로 쿼리가 (가능한 한) 코드의 의도와 일치 할 때 문서화되지 않은 논리를 쉽게 이해할 수 있습니다. 왼쪽 조인 논리는 존재하지 않는 논리와 동일하므로 알아 내기가 더 어렵습니다. 또한 연결 논리를 사용하여 존재를 확인하는 데 잠재적 인 문제가 있습니다. 'AA'+ 'B'= 'A'+ 'AB'- 열은 다른 값을 포함합니다. 가정에주의하십시오.

0

내가 좋아하는 뭔가를 시도 할 것입니다 사전에 도와 주셔서

감사를 67 개 행이 :

;WITH cte AS (
SELECT your needed data 
FROM [dbo].T1 
EXCEPT 
SELECT already existing data 
FROM [dbo].T2 
) 
INSERT INTO dbo.T2 
SELECT * 
FROM cte 
+0

조언 해 주셔서 감사합니다. 불행히도 나는 다른 방법으로 T2를위한 기본 키 코드를 생성 할 수 없다.이 코드는 모든 부분을 다루는 소프트웨어 조각에 의해 생성 된 코드이며,이 proc의 시퀀스에서 다음 번호를 얻어야한다. – David

+0

CTE를 사용하여 T2 기본 키를 생성 할 수 없기 때문에 CTE가 작동하지 않을 것이라고 생각하기 때문에 병합을 조사 할 것입니다. – David

0

JOIN 논리에 결함이 있습니다. 당신의 INSERT에서

이 있습니다

LEFT JOIN dbo.T2 b 
     ON a.Prod_Code + a.Column_Header = b.part 
: [부분]

INSERT INTO dbo.T2 
SELECT @Part       AS [part], 
     [Prod_Code] + Column_Header  AS [identifier], 

삽입 @Part을 그러나 당신이 당신의 작업을 수행 할 때 기존 행을 배제하기 위해 가입, 당신이 있습니다

기존 행을 제외하려면 @part=b.part에 가입해야합니다.

관련 문제