J'ai une procédure stockée avec plusieurs instructions insert/select. Disons que j'utilise le premier insert pour remplir une table "Manager". Sur insert, un ManagerId (incrémenté automatiquement) est ajouté, mais pas référencé dans l'instruction insert. Je souhaite ensuite utiliser le ManagerId de cette table pour insérer une ligne dans une autre table, où ManagerId est une clé étrangère. Exemple de code comme suit.Récupération de la valeur de colonne auto-incrémentée de la table où plusieurs insertions/sélections dans une procédure stockée unique
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
Ceci, évidemment, ne fonctionne pas. C'était ma tentative de résoudre cela. Je suis relativement nouveau à SQL, donc toute aide avec ce problème serait grandement appréciée.
@@ dentity vous donnera la dernière identité, même si elle n'a pas été de l'insertion dans votre portée (comme si l'insert déclenche un trigger) –
D'accord avec KM, je n'utiliserais jamais @@ identity car tôt ou tard vous aurez des problèmes d'intégrité des données. SAme avec ident_current (vous pouvez obtenir l'identité d'un autre processus juste inséré après le vôtre). Si je veux l'identité que je viens d'insérer j'utilise scope_identity ou sur une version plus récente, vous pouvez utiliser la clause output (Je ne sais pas si cela est arrivé en 2005 ou 2008 comme nous avons sauté 2005) qui a l'avantage de renvoyer l'ensemble valeurs si vous avez exécuté une insertion d'enregistrement mulitple basée sur un ensemble. – HLGEM