2013-04-09 120 views
2

我遇到了SQL插入到/ select的問題。INSERT INTO/SELECT ONLY INSERTS ONE ROW

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'上可能的重複值? – 2013-04-09 04:05:36

+0

有觸發器嗎? – 2013-04-09 04:05:40

+0

這裏沒有任何觸發器。我已經把我用來創建PMHistory表的代碼放在上面。它有一個獨特的非聚集索引來防止重複,啊......這是問題,因爲它們都有相同的PMDUEDATE,這是約束是....我可以使用非聚集索引的兩個字段的約束? – 2013-04-09 06:13:26

回答

0

也許你在你的表TBLPMHISTORY如DTETHISPMDUE不能爲空和選擇可能包含該列空值有限制。它不必完全是該列,它可以是目標表中的任何其他列。您應該檢查源表中的無效記錄。

0

您的指數正在使用IGNORE_DUP_KEY = ON

這意味着插入的行違反該索引的唯一性將被忽略,即不插入。

通常,您可以將此選項設置爲OFF

+0

呃,那是不對的。您嘗試插入的第二行會被忽略,即被丟棄,正如我在帖子中所說的那樣。如果你不相信我,就用簡單的測試試試吧。你得到一個警告,但重複的行被丟棄。你所描述的更像是合併。 – muhmud 2013-04-09 07:46:10

+0

你是對的。刪除我以前的評論 – 2013-04-09 08:04:56

+0

因爲這是每天運行,我希望它丟棄任何重複提出一個錯誤,因此忽略= ON。 – 2013-04-09 23:49:53