如何创建一个等于最后插入行的id的临时变量

时间:2016-08-11 20:20:22

标签: sql sql-server database tsql

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');

我收到了非常详细的错误

  

'INSERT'

附近的语法不正确

3 个答案:

答案 0 :(得分: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;

这比其他方法更可取,因为它显式地将所需信息捕获到表中,然后可以进一步处理。代码更加健壮,因为没有添加代码行的危险"在"之间并打破现有的代码。它还支持同时插入多个值。

答案 1 :(得分:1)

你甚至不需要变量。记住KISS校长。

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

答案 2 :(得分:0)

您可以使用IDENT_CURRENT

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

然后重复使用@CatId

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

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

如果您只需将其限定为会话范围,则可以使用SCOPE_IDENTITY