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 :

Récupérer les identity dans une clause output après avoir inseré dans une vue.


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut Récupérer les identity dans une clause output après avoir inseré dans une vue.
    Bonjour,

    j'ai une vue avec un déclencheur pour insérer dans des tables, dont une table qui a une colonne identity. J'insère des données dans cette table, et je souhaite récupérer la valeur de ces identity dans une clause output. Or, comme vous pouvez le voir dans l'exemple de code complet fourni, je ne récupère pas cet id... Avez-vous une idée, s'il-vous-plait ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    CREATE TABLE My
    (
    	Id INT IDENTITY(1,1) CONSTRAINT PKMy PRIMARY KEY
    );
     
    CREATE TABLE MyLabel
    (
    	Id INT NOT NULL CONSTRAINT FKMyLabel FOREIGN KEY REFERENCES My(Id),
    	Label VARCHAR(50) NOT NULL
    );
    GO
     
    CREATE VIEW VMy
    AS
    	SELECT m.Id, ml.Label
    	FROM My m
    		INNER JOIN MyLabel ml
    			ON ml.Id = m.Id;
    GO
     
    CREATE TRIGGER iVMY ON VMy
    INSTEAD OF INSERT
    AS
    BEGIN    
    	DECLARE @are TABLE (
            Row bigint IDENTITY(1,1) not null primary key,
            Id INT not null
        );
    	MERGE INTO My
    			USING inserted T
    			ON 1 = 0
    			WHEN NOT MATCHED THEN
    			  INSERT
    			  DEFAULT VALUES
    			OUTPUT inserted.Id INTO @are;
     
    	DECLARE @inserted TABLE (
            Id INT not null,
            Label VARCHAR(55) null
        );
        INSERT INTO @inserted
        SELECT
            ISNULL(i.Id, a.Id),
            i.Label
        FROM (
            SELECT
                Id,
                Label,
                ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Id) AS Row
            FROM
                inserted
        ) i
        LEFT JOIN
            @are a
        ON a.Row = i.Row;
    END;
    GO
     
    CREATE TABLE #TEST
    (
    	Label VARCHAR(50)
    )
     
    INSERT INTO #TEST
    VALUES ('HOP'), ('POUET'), ('TEST')
     
    CREATE TABLE #INSERTED
    (
    	Id INT,
    	Label VARCHAR(50)
    )
     
    INSERT INTO VMy(Label)
    OUTPUT inserted.Id, inserted.Label INTO "#INSERTED"
    SELECT	Label
    FROM #TEST
     
    SELECT *
    FROM #INSERTED
    Résultat :
    Id Label
    NULL HOP
    NULL POUET
    NULL TEST

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Il ne faut pas utiliser un trigger INSTEAD OF mais AFTER INSERT ou bien récupérer les ID après l'insertion dans le déclencheur INSTEAD OF.

    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/ * * * * *

  3. #3
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    Bonjour, et merci pour l'aide !

    Malheureusement, on ne peut pas utiliser de trigger "AFTER INSERT" sur une vue
    Et je ne vois pas comment passer les ID du trigger à l'appelant...

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Monstros Velu Voir le message
    Bonjour, et merci pour l'aide !

    Malheureusement, on ne peut pas utiliser de trigger "AFTER INSERT" sur une vue
    Et je ne vois pas comment passer les ID du trigger à l'appelant...
    Si, à condition de faire l'INSERT dans une seule des tables de la vue….

    Au lieu de nous communiquer des pseudo tables, donnez nous de vrais élément afin qu'on vous aide…. parce que une table d'une seule colonne de type ID autoincrémenté…. Je voit pas bien l'usage !

    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/ * * * * *

  5. #5
    Membre éclairé Avatar de Monstros Velu
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 619
    Par défaut
    Et pourtant, c'est ainsi qu'est modelée la base : Les entités (anchor) sont juste des tables avec un Id, et les attributs sont dans des tables séparées. Je peux avoir 10 attributs sur une entité, j'aurai 11 tables (1 pour l'entité et 10, une pour chaque attributs). La seule différence avec le pseudo modèle de l'exemple, c'est que j'ai des temporal tables.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 599
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Quel intérêt de créer une table par colonne ?
    Dans votre exemple, avec 10 attributs, il faut faire 11 jointures si l'on veut récupérer les valeurs de toutes les colonnes et si je veux joindre le résultat avec une autre table de 20 colonnes ...

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

Discussions similaires

  1. Récupérer les données d'une vue
    Par rachida90 dans le forum Spring Web
    Réponses: 0
    Dernier message: 26/05/2013, 17h45
  2. Récupérer les données d'une vue
    Par rachida90 dans le forum Hibernate
    Réponses: 0
    Dernier message: 26/05/2013, 03h42
  3. impossible de récupérer les mesures d'une vue
    Par ybearzi dans le forum Android
    Réponses: 8
    Dernier message: 13/11/2010, 17h50
  4. Récupérer les variables dans une popup
    Par Msieurduss dans le forum Langage
    Réponses: 4
    Dernier message: 21/08/2006, 20h05
  5. récupérer les paramètres dans une url
    Par asetti dans le forum ASP
    Réponses: 6
    Dernier message: 23/12/2005, 10h08

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