SQL插入选择@@Identity

6

当我使用INSERT SELECT时,如何使用@@IDENTITY?

DECLARE @ENTITYID AS BIGINT

INSERT INTO Quiz_QuizQuestion
SELECT @ENTITYID,
       @DIFICULTLEVELCODE,
       ENTITYID,
       @QuizEntityId,
       Title,
       [Description],
       [Description],
       Duration
FROM   Education_Question
WHERE  EntityID = 1 --THIS SELECT RETURN JUST 1 RECORD
SET @ENTITYID = @@IDENTITY

SELECT @ENTITYID // NULL  

2
Quiz_QuizQuestion 是否有任何列被定义为 IDENTITY?(注:99% 的情况下,您仍然需要使用 SCOPE_IDENTITY,但这里不应该解释为什么 @ENTITYID IS NULL - Martin Smith
那就是为什么它是NULL。它会返回你的会话中最后插入的标识值。 - Martin Smith
1
我建议您使用SCOPE_IDENTITY()而不是@@IDENTITY - 使用 @@IDENTITY 可能会得到错误的结果(有关详细信息请参见此处的博客文章 - marc_s
SQL消息:(已影响1行) @@IDENTITY = NULL; - AFetter
4个回答

4
这是从MSDN关于@@IDENTITY的页面抄录: “在执行INSERTSELECT INTO或批量复制语句后,@@IDENTITY包含由该语句生成的最后一个标识值。如果该语句未影响到任何具有标识列的表,则@@IDENTITY将返回NULL。如果插入了多行并生成了多个标识值,则@@IDENTITY将返回最后一个生成的标识值。” (链接)。我不知道你是否需要更多信息。

SQL消息:(已影响1行) @@IDENTITY = NULL; - AFetter
2
@Coelho - 你在评论中说你的表没有标识列,因此在插入后@@IDENTITY将为NULL - Lamak
抱歉,这张表有一个键,EntityID 是主键。 - AFetter
1
@Coelho - 主键和自增列是完全不同的东西。主键可以是自增的,但不一定要是自增的。 - Lamak

4

在您的情况下,您不需要将 @@IDENTITY 插入表中 - 您需要创建带有 IDENTITY 字段的表,如下所示:

CREATE TABLE Quiz_QuizQuestion
(
  EntityId int IDENTITY NOT NULL,
  ...
)
GO

DECLARE @ENTITYID AS BIGINT

INSERT INTO Quiz_QuizQuestion
SELECT 
       @DIFICULTLEVELCODE,
       ENTITYID,
       @QuizEntityId,
       Title,
       [Description],
       [Description],
       Duration
FROM   Education_Question
WHERE  EntityID = 1 --THIS SELECT RETURN JUST 1 RECORD
SET @ENTITYID = SCOPE_IDENTITY()

SELECT @ENTITYID // NULL 

1

@@identity 只会返回最后一个插入到 IDENTITY 字段 中的值。

你需要创建一个 IDENTITY 字段 :)


1

试试这个:

--Create Table
--CREATE TABLE TableName (Col_A INT IDENTITY (1,1), Col_B NVARCHAR(10))

INSERT INTO TableName VALUES ('TEST01')
SELECT @@IDENTITY

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接