我想知道是否有人能帮助我完成下面的SQL代码。我正在尝试将BC_completions表中的所有记录插入到地理数据表中。如果排除insert上的ID列,则会得到'Msg 515.无法将值NULL插入'ID‘列。但是,如果我将它包括在下面,我会得到一个'Msg ...Violation的主键约束‘。
更让人困惑的是,如果我手动输入从@PK获得的值,数据库就会接受它,所以这里的任何帮助都是很棒的。
谢谢
DECLARE @PK AS INT
DECLARE @COUNT AS INT
DECLARE @RECORDCOUNT AS INT
SET @PK =
(SELECT TOP 1 ID FROM PRCORE.DBO.GEODATA
ORDER BY ID DESC)
SET @RECORDCOUNT =
(SELECT COUNT(*) FROM BC_COMPLETIONS)
SET @COUNT = 0
WHILE @COUNT < @RECORDCOUNT
BEGIN
SET @PK = @PK+1
SET @COUNT = @COUNT+1
INSERT INTO PRCORE.DBO.GEODATA
(ID,RecordType,ReferenceName,LocationDescription,Description,ORN,StartDate,ChgText)
SELECT @PK,189,REFVAL,ADDRESS,DSCRPN,ORN,RECPTD,AGTNAME
FROM BC_COMPLETIONS B
where @PK not in (select ID from prcore.dbo.geodata)
END 发布于 2014-09-17 13:31:44
这是insert语句的循环和WHERE约束中的一个问题。您将从BC_COMPLETIONS中选择所有记录,并将它们分配给同一个PK。
相反,使用ROW_NUMBER()函数分配PK,这将允许您一次完成所有操作,而不是一次创建一个记录:
DECLARE @PK AS INT
DECLARE @RECORDCOUNT AS INT
SET @PK = (SELECT TOP 1 ID FROM PRCORE.DBO.GEODATA ORDER BY ID DESC) + 1
SET @RECORDCOUNT = (SELECT COUNT(*) FROM BC_COMPLETIONS)
INSERT INTO PRCORE.DBO.GEODATA (ID,RecordType,ReferenceName,LocationDescription,Description,ORN,StartDate,ChgText)
SELECT ROW_NUMBER() OVER(ORDER BY REFVAL) + @PK ,189,REFVAL,ADDRESS,DSCRPN,ORN,RECPTD,AGTNAME
FROM BC_COMPLETIONS Bhttps://stackoverflow.com/questions/25891822
复制相似问题