IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

OUTPUT maColonnePK vs SCOPE_IDENTITY()


Sujet :

Développement SQL Server

  1. #1
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut OUTPUT maColonnePK vs SCOPE_IDENTITY()
    Bonjour,

    Dans le contexte où l'on n'insère qu'une seule ligne avec la commande INSERT et sa clause VALUES dans une table dont la colonne de clé primaire est auto-incrémentée, est-ce contre-performant d'utiliser la clause OUTPUT pour retourner la valeur de la clé primaire plutôt que d'utiliser la fonction SCOPE_IDENTITY() ?

    En vous remerciant de vos réponses et explications,

    @++

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Je dirais dans ce cas précis que d'utiliser la clause OUTPUT est peut être préférable.

    Si on regarde dans SQL Profiler :

    - Pour retourner l'identity généré lors de l'insertion avec la fonction SCOPE_IDENTITY() on remarque qu'il faudra 2 requêtes (1 insert + 1 Select)
    - Avec la clause OUTPUT tout se passe en une seule requête donc un seul aller retour à la base de données.

    J'espère que l'explication t'ira

    ++

  3. #3
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonsoir,

    C'est intéressant comme question

    Pour récupérer la valeur de l'identity dans une variable avec output, ne faut il pas passer par une table mémoire ? (Je ne sais pas faire autrement ). Si c'est le cas ça ne dois pas être plus léger.

    Si c'est pour réutiliser le résultat directement avec les composable DML de 2008, ça me semble intéressant.

    @+

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    En fait tout dépend ce qu'on veut faire ... il faut bien le préciser.

    Moi je pensais à une procédure stockée ou à une extraction du résultat directement dans un programme .NET par exemple (via sqlcommand etc ...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO dbo.tableTest(colonneTest)
    OUTPUT INSERTED.colonneIdentity
    VALUES('TEST')
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO dbo.tableTest(colonneTest)
    VALUES('TEST')
     
    SELECT SCOPE_IDENTITY()
    et qui retourne la même chose

    ++

  5. #5
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Et ouais, il n'est pas précis ce elsuket, quand même

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    T'as finis de te moquer... ? ;-)

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Tu sais, en fait, je l'adore ce süket ,
    Mais bon, faut pas trop lui montrer, sinon il risque d'en oublier un where dans un update

    @+

  8. #8
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Ne vous moquez pas de l'homme qui murmurait à l'oreille des CTE svp !!!

  9. #9
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Impeccable les copains, je m'absente une journée et je vois que je suis comme la crise, j'ai bon dos

    sinon il risque d'en oublier un where dans un update
    OK c'est vrai, ce matin j'étais pas franchement réveillé

    Bon, concernant mon hypothétique manque de précisions :

    pour retourner la valeur de la clé primaire
    devient "pour retourner la valeur de la clé primaire à une application"

    Cela revient donc à la seconde requête que nous a proposé l'Ô combien vénérable Mikedavem , et pour les mauvaises langues, nous n'insérons toujours qu'une seule ligne.

    Quel dommage qu'on ne puisse pas écrire de CTE sur la clause OUTPUT !!!

    @++

  10. #10
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    OK c'est vrai, ce matin j'étais pas franchement réveillé
    Moi non plus

    Je me prosterne devant le vénérable mikedavem

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. <xsl:output method="text">
    Par Sylvain James dans le forum XMLRAD
    Réponses: 4
    Dernier message: 24/02/2005, 14h51
  2. Utiliser immédiatement un Scope_Identity()
    Par MiJack dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/09/2004, 13h44
  3. Procedure stockée avec un parametre en OUTPUT
    Par Nadaa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/09/2004, 20h06
  4. Renvoyer un OUTPUT de plusieurs types
    Par omlip dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 13/08/2004, 10h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo