我有一些存储过程,用于在某些表中插入/更新记录。这些表的某些列具有默认值或自动递增。这就是我所拥有的:
ALTER PROCEDURE [dbo].[Usp___NewExpense]
@iCampaignID int,
@iCategory int,
@iUserID int,
@dDate Date,
@iAmountInINR int,
@strComments VarChar(200)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO dbo.Tbl_Expenses(iCampaignID, iCategory, dDate, iAmountInINR, strComments)
VALUES (@iCampaignID, @iCategory, @dDate, @iAmountInINR, @strComments);
-- How to get the record inserted using the above statement here without using triggers
-- or another select statement, so that I can assign values to the following variables?
Declare @justInsertedValue1 type1;
Declare @justInsertedValue2 type2;
Declare @justInsertedValue3 type3;
INSERT INTO dbo.Tbl_SomeOtherTable(col1, col2, col3)
VALUES (justInsertedValue1, justInsertedValue2, justInsertedValue3);
END
GO
Tbl_Expenses
有大约9列,其中两列有默认值,两列有自动增量集。如何在INSERT
语句下方获取刚插入的记录?
我知道我可以使用SCOPE_IDENTITY()
然后使用SELECT
,但查询可能会使效率低下(我是对的吗?)。
(通过获取刚插入的记录,我的意思是刚刚插入的记录的所有字段的值)
修改:我没有为INSERT
语句中的所有字段指定值。由于DEFAULT / AUTO INCREMENT约束,我希望SQL Server自动插入这些值。
答案 0 :(得分:8)
您可以使用OUTPUT
clause。您甚至可以将inserts
合并为一个合成:
create table T1 (ID int IDENTITY(1,1) not null,ColA varchar(10) not null)
create table T2 (ID int IDENTITY(1,1) not null,T1ID int not null,ColB varchar(10) not null)
--Look ma! no local variables at all
insert into T2 (T1ID,ColB)
select t1.ID,'def'
from (
insert into T1(ColA)
output inserted.ID
values ('abc')
) t1
select * from T1
select * from T2
结果:
ID ColA
----------- ----------
1 abc
ID T1ID ColB
----------- ----------- ----------
1 1 def