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'
附近的语法不正确
答案 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