【发布时间】:2014-09-17 13:22:22
【问题描述】:
我想知道是否有人可以帮助我编写下面的 SQL 代码。我正在尝试将我的 BC_completions 表中的所有记录插入到我的 Geodata 表中。如果我在插入时排除 ID 列,我会得到一个“消息 515 ... 无法将值 NULL 插入到列“ID”中。但是,如果我将其包含在下面,我会收到“Msg ...违反 PRIMARY KEY 约束”。
更令人困惑的是,如果我手动输入从 @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
【问题讨论】:
-
为什么不使用自动递增的标识列,这样您就不必执行任何这些操作了?
-
嗨,Michael,因为我不知道如何创建,而且我从未创建过 Geodata 表,因此不知道如何检查此 ID 列是否已经出现这种情况。
-
如果您使用 SSMS 右键单击表,选择 Script Table as -> CREATE TO -> New Query Editor Window。复制并粘贴上面的结果。它将向您显示有关该表的所有信息,包括它是否是这样创建的。
-
谢谢 Michael - 我也是通过查看 ID 列的列属性发现的,Identity Specification 设置为 No。所以我的理解是这不是一个自动递增的列。跨度>
标签: sql sql-server