我有一个基本的存储过程,它将新记录添加到具有如下结构的表中。该表还有一个“itemID”列,设置为自动递增以为每条记录创建唯一ID。
我想使用Output从我插入的新记录中获取此ID,然后使用它将新记录添加到另一个表( Table2 with column colD,colE,colF )。表2中的colF应该是下面的输出,因为这是链接两个表的id。
有人可以告诉我这是如何工作的,因为我对SQL很陌生并且之前从未这样做过吗?
我的存储过程(示例):
ALTER PROCEDURE [dbo].[CreateStuff]
@colA datetime,
@colB varchar(50),
@colC nvarchar(20)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Table1
(
colA,
colB,
colC
)
SELECT @colA,
@colB,
@colC
END
非常感谢你提供任何帮助,蒂姆。
答案 0 :(得分:3)
BEGIN
SET NOCOUNT ON;
/* Here declare a Table Variable */
DECLARE @Table_Var TABLE(itemID INT)
INSERT INTO Table1(colA,colB,colC)
OUTPUT inserted.itemID INTO @Table_Var(itemID)
SELECT @colA,@colB,@colC
/* Now do the insert into Table 2*/
INSERT INTO TABLE2
SELECT itemID FROM @Table_Var
END
SCOPE_IDENTITY()
仅在您执行单个Insert时才有用,并且它是您想要捕获的IDENTITY列。它将仅返回最后生成的标识值。
除此之外,如果您正在进行多次插入或它不是标识列,那么您应该使用OUTPUT
子句以及表vairable / temp表来捕获插入的值。然后在以后做任何你想做的事情(插入另一个表/记录任何东西)。
要了解有关OUTPUT Clause
的更多信息,请查看此链接。
答案 1 :(得分:2)
尝试SCOPE_IDENTITY()
:
ALTER PROCEDURE [dbo].[CreateStuff]
@colA datetime,
@colB varchar(50),
@colC nvarchar(20),
@Valueout int output
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Table1
(
colA,
colB,
colC
)
SELECT @colA,
@colB,
@colC
SET @Valueout = SCOPE_IDENTITY()
END
答案 2 :(得分:1)
您可以按如下方式在表格上创建触发器:
CREATE TRIGGER Trigger_Name
ON Table_Name
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO Table1 ( colA, colB, colC )
SELECT colA, colB, colC FROM Inserted
END