2013-04-09 77 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