Chr*_*ris 5 sql sql-server stored-procedures
我有一个包含多个insert/select语句的存储过程.假设我使用第一个插入来填充"Manager"表.在插入时,添加了ManagerId(自动递增),但未在insert语句中引用.然后,我希望使用此表中的ManagerId将行插入另一个表,其中ManagerId是外键.示例代码如下..
USE [TEST]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sptInsertNewManager]
-- Add the parameters for the stored procedure here
@FName varchar(50),
@LName varchar(50),
@EMail varchar(100),
@UserRoleID int,
@LANUserID varchar(25),
@GroupID int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
INSERT INTO [Manager]
([FName],
[LName],
[Email],
[UserRoleID],
[LANUserID],
[ActiveFlag],
[GroupID]
)
VALUES
(@FName
,@LName
,@EMail
,@UserRoleID
,@LANUserID
,1
,@GroupID);
COMMIT
SELECT ManagerId FROM [Manager] AS newManager WHERE LANUserID = @LANUserID;
--also insert into Users table.
INSERT INTO [dbo].[aspnet_Users] (
[UserId],
[UserName],
[LoweredUserName],
[ManagerId]
)
VALUES (
NEWID(),
@LANUserID,
LOWER(@LANUserID),
newManager)
END
Run Code Online (Sandbox Code Playgroud)
显然,这不起作用.这是我试图解决这个问题.我对SQL很新,所以对此问题的任何帮助都将非常感激.
在插入之后使用scope_identity()来捕获当前范围内的最新单个标识值:
DECLARE @ID int
INSERT ......
SELECT @ID=scope_identity()
Run Code Online (Sandbox Code Playgroud)
在任何需要的地方使用@ID
注意:SCOPE_IDENTITY()优先于旧的@@ IDENTITY,因为它提供了当前作用域中的最后一个Identity值,这避免了插入日志表(带有标识)的触发器的问题.
但是,如果您需要多个标识值(插入一组行),请使用OUTPUT和INTO:
declare @test table (RowID int identity(1,1) primary key not null, RowValue varchar(10) null)
declare @OutputTable table (RowID int not null)
insert into @test (RowValue)
OUTPUT INSERTED.RowID
INTO @OutputTable
SELECT 'A'
UNION SELECT 'B'
UNION SELECT 'C'
UNION SELECT 'D'
UNION SELECT 'E'
select * from @OutputTable
Run Code Online (Sandbox Code Playgroud)
输出:
(5 row(s) affected)
RowID
-----------
1
2
3
4
5
(5 row(s) affected)
Run Code Online (Sandbox Code Playgroud)