Dans SQL Server, est-il possible d'obtenir « l'identifiant » d'un enregistrement lorsque Insert est exécuté ?

StackOverflow https://stackoverflow.com/questions/55159

  •  09-06-2019
  •  | 
  •  

Question

Dans SQL Server 2005, j'ai un champ « id » dans une table dont la propriété « Is Identity » est définie sur « Oui ».Ainsi, lorsqu'une insertion est exécutée sur cette table, "l'identifiant" est automatiquement défini sur l'entier incrémentiel suivant.Existe-t-il un moyen simple, lorsque l'insertion est exécutée, d'obtenir ce à quoi "l'identifiant" a été défini sans avoir à faire une instruction Select juste après l'insertion ?

duplicata de :
La meilleure façon d'obtenir l'identité de la ligne insérée ?

Était-ce utile?

La solution

Dans .Net au moins, vous pouvez envoyer plusieurs requêtes au serveur en une seule fois.Je fais ça dans mon application :

command.CommandText = "INSERT INTO [Employee] (Name) VALUES (@Name); SELECT SCOPE_IDENTITY()";
int id = (int)command.ExecuteScalar();

Fonctionne à merveille.

Autres conseils

Si vous insérez plusieurs lignes, l'utilisation de la OUTPUT et INSERTED.columnname clause sur le insert L'instruction est un moyen simple d'obtenir tous les identifiants dans une table temporaire.

DECLARE @MyTableVar table( ID int,  
                               Name varchar(50),  
                               ModifiedDate datetime);  
INSERT MyTable  
        OUTPUT INSERTED.ID, INSERTED.Name, INSERTED.ModifiedDate INTO @MyTableVar  
SELECT someName, GetDate() from SomeTable  

Scope_identity() est la méthode préférée, voir : 6 façons différentes d'obtenir la valeur d'identité actuelle

SCOPE_IDENTITY();est votre meilleur pari.Et si vous utilisez .NET, transmettez simplement un paramètre our et vérifiez la valeur une fois la procédure exécutée.

CREATE PROCEDURE [dbo].[InsertProducts]
    @id             INT             = NULL OUT,
    @name           VARCHAR(150)    = NULL,
    @desc           VARCHAR(250)    = NULL

AS

    INSERT INTO dbo.Products
       (Name,
        Description)
    VALUES
       (@name,
        @desc)

    SET @id = SCOPE_IDENTITY();

Vous devez sélectionner la fonction scope_identity().

Pour ce faire à partir du code de l'application, j'encapsule normalement ce processus dans une procédure stockée afin qu'il ressemble toujours à une requête adressée à mon application.

J'ai tendance à préférer attacher un déclencheur à la table à l'aide du gestionnaire d'entreprise.De cette façon, vous n'avez pas à vous soucier d'écrire des instructions SQL supplémentaires dans votre code.Le mien ressemble à ceci :

Créer un déclencheur tblname sur dbo.tblname pour insérer comme sélectionner new_id = @@ identité

Ensuite, à partir de votre code, traitez vos instructions d'insertion comme des instructions de sélection : exécutez et évaluez simplement les résultats.la colonne "newID" contiendra l'identité de la ligne que vous venez de créer.

C'est probablement la meilleure solution de travail que j'ai trouvée pour SQL Server.SQL Server renvoie la valeur de la colonne d'identité après l'instruction d'insertion

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top