2012-01-16 74 views
5

如何在使用INSERT SELECT时使用@@ IDENTITY?SQL 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'(NB任何列?的99%的时间你需要'SCOPE_IDENTITY'但无论如何不应该't解释了为什么'@ENTITYID是NULL') – 2012-01-16 13:02:17

+0

不,只有一个,EntityID - 密钥 – AFetter 2012-01-16 13:03:38

+0

那么这就是为什么它然后是NULL。它[返回最后插入的身份值。](http://msdn.microsoft.com/zh-cn/library/ms187342.aspx)用于会话。 – 2012-01-16 13:04:25

回答

4

你不必插入@@ IDENTITY到表中您的方案 - 你必须CREATEIDENTITY场这样的:

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 
2

这是从MSDN逐字复制页面大约@@IDENTITY: “在INSERTSELECT INTO或大容量复制语句完成后,@@IDENTITY包含该语句生成的最后一个标识值。如果声明不影响任何带有标识列的表,@@IDENTITY返回NULL。如果多行插入,产生多个标识值,@@ IDENTITY返回最后产生的标识值。”(link)。我不知道,如果你需要更多的信息。

+0

sql消息:(1 row(s)affected) @@ IDENTITY = NULL; – AFetter 2012-01-16 14:36:41

+2

@Coelho - 您对评论表示您的表没有标识列,因此在您插入后,@ @ IDENTITY将为'NULL' – Lamak 2012-01-16 15:06:50

+0

对不起,表中有一个键,EntityID是主键。 – AFetter 2012-01-16 17:10:06

1

@@identity只给插入的最后一个值。在IDENTITY field

你需要创建一个IDENTITY field代替:)