2013-04-09 5 views
2

내 SQL Insert/select에 문제가 있습니다.INSERT INTO/SELECT ONLY ONEOW 행 선택

INSERT INTO TBLPMHISTORY(RELEQUIPMENTID,DTETHISPMDUE,STRCAMPUS,STRROOM) 
(SELECT INTEQUIPMENTID,DTEPMDATENEXTDUE,STRCAMPUS,STRROOM 
FROM TBLEQUIPMENT 
WHERE DTEPMDATENEXTDUE BETWEEN GETDATE() AND DATEADD("DAY",21,GETDATE())) 

단지 새 테이블에 한 행을 삽입 할 것 같다,하지만 난 그 자체 명령문의 SELECT 부분을 실행할 때, 그것은 다시 84 개 행이 제공됩니다.

일괄 삽입을 제한하고있는 항목이 있는지는 잘 모르지만 도움이된다면 많은 도움이 될 것입니다.

코드

다음과 같이 PMHISTORY 테이블이 만들려면 다음

CREATE TABLE TBLPMHISTORY( 
INTPMHISTORYID INT NOT NULL PRIMARY KEY IDENTITY, 
RELEQUIPMENTID INT NOT NULL FOREIGN KEY REFERENCES TBLEQUIPMENT(INTEQUIPMENTID), 
STRDESCRIPTION VARCHAR(64) DEFAULT 'Preventative Maintenance', 
DTETHISPMDUE DATETIME, 
YSNPMDONE BIT DEFAULT '0', 
YSNPMCONVERTEDTOJOB BIT DEFAULT '0', 
INTRELATEDJOBNUMBER INT DEFAULT '0', 
STRCAMPUS VARCHAR(30), 
STRROOM VARCHAR(30)) 

CREATE UNIQUE NONCLUSTERED INDEX [IX_PMHistory_DTETHISPMDUE] ON TBLPMHISTORY(DTETHISPMDUE) WITH (IGNORE_DUP_KEY = ON) ON [PRIMARY] 
+0

오류가 다시 발생하지 않습니까? 'TBLPMHISTORY'에서 가능한 중복 값을 방지하는 고유 한 제약 조건이나 키가 있습니까? –

+0

방아쇠가 작동하고 있습니까? –

+0

재생할 트리거가 없습니다. 위의 PMHistory 테이블을 만드는 데 사용한 코드를 넣었습니다. 그것은 중복을 방지하기 위해 고유 한 비 클러스터형 인덱스를 가지고 있습니다. 아 ... 모든 제약 조건이 동일한 PMDUEDATE를 가지고 있기 때문에 문제가 있습니다 .... 클러스터되지 않은 인덱스를 사용하여 두 필드에 제약 조건을 둘 수 있습니까? –

답변

0

아마 당신은 DTETHISPMDUE은 null 일 수 없습니다 및 선택이 해당 컬럼에 null 값을 포함 할 수 있습니다와 같은 테이블에 TBLPMHISTORY에 제약이있다. 정확히 열이 될 필요는 없으며 대상 테이블의 다른 열이 될 수 있습니다. 원본 테이블에서 유효하지 않은 레코드가 있는지 확인해야합니다.

0

인덱스가 IGNORE_DUP_KEY = ON을 사용 중입니다.

즉,이 색인의 고유성을 위반하는 삽입 된 행은 무시되거나 삽입되지 않습니다.

일반적으로이 옵션은 OFF으로 설정해야합니다.

+0

음, 그게 옳지 않아. 삽입하려는 두 번째 행은 무시됩니다. 즉, 내 게시물에서 말한 것처럼 삭제됩니다. 당신이 나를 믿지 않는다면 간단한 시험으로 시험해보십시오. 경고를 받지만 중복 행은 버려집니다. 당신이 묘사하는 것은 병합과 같은 것입니다. – muhmud

+0

네 말이 맞아. 내 이전의 덧글을 제거 –

+0

이것은 매일 실행되므로 나는 오류를 일으키는 모든 중복을 폐기하므로 무시 = ON. –