web-dev-qa-db-fra.com

Procédure stockée - retourne l'identité en tant que paramètre de sortie ou scalaire

Lorsque vous insérez un enregistrement dans une table avec une colonne d'identité, vous pouvez utiliser SCOPE_IDENTITY () pour obtenir cette valeur. Dans le contexte d'une procédure stockée, la méthode recommandée pour renvoyer la valeur d'identité est la suivante:

  1. En tant que paramètre de sortie SET @RETURN_VALUE = SCOPE_IDENTITY()
  2. En tant que scalaire SELECT SCOPE_IDENTITY()
  3. Autrement?

Des avantages/inconvénients à chacun?

43
Nelson Rothermel

Tout dépend de la couche d'accès aux données de votre client. De nombreux frameworks ORM reposent sur l'interrogation explicite de SCOPE_IDENTITY lors de l'opération d'insertion.

Si vous maîtrisez parfaitement la couche d'accès aux données, il est sans doute préférable de renvoyer SCOPE_IDENTITY () en tant que paramètre de sortie. Le retour du résultat dans un jeu de résultats ajoute une surcharge inutile de métadonnées pour décrire le jeu de résultats et complique le code permettant de traiter le résultat des demandes.

Si vous préférez un résultat, vous pouvez de nouveau utiliser la clause OUTPUT:

INSERT INTO  MyTable (col1, col2, col3)
OUTPUT INSERTED.id, col1, col2, col3
VALUES (@col1, @col2, @col3);

De cette façon, vous pouvez obtenir la ligne entière insérée, y compris les colonnes par défaut et calculées, et obtenir un jeu de résultats contenant une ligne pour chaque ligne insérée, fonctionnant correctement avec les insertions par lots orientées.

Globalement, je ne vois pas un seul cas lors du renvoi de SCOPE_IDENTITY() car un jeu de résultats serait une bonne pratique.

38
Remus Rusanu

Une autre option serait la valeur de retour pour la procédure stockée (je ne le suggère cependant pas, car c'est généralement préférable pour les valeurs d'erreur).

Je l'ai inclus à la fois lorsqu'il s'agit d'insérer une seule ligne dans les cas où la procédure stockée était utilisée par d'autres procédures SQL et un front-end qui ne pouvait pas fonctionner avec les paramètres OUTPUT (IBATIS dans .NET, je crois):

CREATE PROCEDURE My_Insert
    @col1            VARCHAR(20),
    @new_identity    INT    OUTPUT
AS
BEGIN
    SET NOCOUNT ON

    INSERT INTO My_Table (col1)
    VALUES (@col1)

    SELECT @new_identity = SCOPE_IDENTITY()

    SELECT @new_identity AS id

    RETURN
END

Le paramètre de sortie est plus facile à utiliser dans T-SQL lorsqu’il appelle à partir d’autres procédures stockées IMO, mais certains langages de programmation ne prennent pas en charge, voire aucun, les paramètres de sortie et fonctionnent mieux avec les ensembles de résultats.

41
Tom H

Je préfère renvoyer la valeur d'identité en tant que paramètre de sortie. Le résultat de SP doit indiquer s'il a réussi ou non. Une valeur de 0 indique que SP s'est terminé avec succès, une valeur non nulle indique une erreur. De même, si vous devez effectuer une modification et renvoyer une valeur supplémentaire à partir de SP), vous ne devez apporter aucune modification autre que l'ajout d'un paramètre de sortie supplémentaire.

3
TLiebe

En tant que jeu d'enregistrements ou paramètre de sortie. Ce dernier a moins de temps système et j'aurais tendance à l'utiliser plutôt qu'à un seul jeu d'enregistrements colonne/ligne.

Si je m'attendais à> 1 ligne, j'utiliserais la clause OUTPUT et un jeu d'enregistrements

Les valeurs de retour seraient normalement utilisées pour la gestion des erreurs.

2
gbn
SELECT IDENT_CURRENT('databasename.dbo.tablename') AS your identity column;
1
billah77