2016-08-11 66 views
1

SQL n00b此处。任何想法我做错了什么?希望你能弄清楚我打算做什么。如何创建一个临时变量,该临时变量等于上一次插入的行的编号

DECLARE @CatId INT; 
SET @CatId = (
    INSERT INTO Categories (CategoryName) VALUES ('TestCategory'); 
    SELECT SCOPE_IDENTITY() 
); 
INSERT INTO Fields (CategoryID,FieldName,DisplayName) VALUES (@CatId,'TestName','TestDisplayName'); 

我得到的不是非常详细的错误

附近有语法错误“插入”

+0

查询中没有“IMPORT” – Lamak

+1

您不能设置这样的变量。 –

+0

使用OUTPUT插入临时表或表变量中,特别是如果您的设置操作将超过1条记录。 – Matt

回答

1

你甚至都不需要为这个变量。记住KISS校长。

INSERT INTO Categories (CategoryName) VALUES ('TestCategory'); 
INSERT INTO Fields (CategoryID,FieldName,DisplayName) VALUES (SCOPE_IDENTITY(),'TestName','TestDisplayName'); 
0

您可以使用IDENT_CURRENT

DECLARE @CatId INT 
SELECT @CatId = IDENT_CURRENT('Categories') 

然后再用@CatIdINSERT

INSERT INTO Fields (CategoryID, FieldName, DisplayName) VALUES (@CatId,'TestName','TestDisplayName'); 

IDENT_CURRENT返回在任何会话和范围的特定表生成的最后一个标识值。

如果你需要它来只作用域到您的会话,你可以使用SCOPE_IDENTITY

+0

这有潜在的并发问题。 –

+0

@SeanLange如果多个会话有问题,则OP可以使用'SCOPE_IDENTITY' –

+0

您的代码应始终能够处理多个会话。当您像这样使用IDENT_CURRENT时,您正在创建竞争条件。为什么要使用有可能成为问题的东西?只需使用SCOPE_IDENTITY即可,您不必限定它。 –

3

在SQL Server中,来处理这个正确的方式是OUTPUT条款。我建议你学习这种方法并坚持下去。

DECLARE @CatIds TABLE (catid int); 

INSERT INTO Categories (CategoryName) 
    OUTPUT inserted.catid INTO @CatIds; 
    VALUES ('TestCategory'); 

INSERT INTO Fields(CategoryID, FieldName, DisplayName) 
    SELECT CatId, 'TestName', 'TestDisplayName' 
    FROM @CatIds; 

这是优选的其他方法,因为它明确捕获所需的信息到表,然后可以被进一步处理。代码更健壮,因为没有在“之间”添加一行代码并破坏现有代码的危险。它也支持同时插入多个值。