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 :

Trigger sur table SQL (Express 2008 R2) [2008R2]


Sujet :

Développement SQL Server

  1. #21
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Allons y pour les grosses merde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE SOURCE 
    (
            K               INT             NOT NULL 
          , ID              INT             NOT NULL
          , vb              VARCHAR (4)     NOT NULL  
        , CONSTRAINT SOURCE_PK PRIMARY KEY (K)             
    ) ;
    J'ai repris ta table pour pas me fouler....

    Et la vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE VIEW V_MA_GROSSE_MERDE_COSMÉTIQUE
    AS
    SELECT K,
           CASE WHEN ID = 1 THEN vb END AS vb1,
           CASE WHEN ID = 2 THEN vb END AS vb2,
           CASE WHEN ID = 3 THEN vb END AS vb3,
    	   ...
           CASE WHEN ID = N THEN vb END AS vbN
    FROM   SOURCE;
    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/ * * * * *

  2. #22
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Fred,



    Je crains que ta solution ne réponde pas au problème posé. On est en présence d’une sorte de modulo 5, et ce qu’on doit produire :

    Pour ID = 1 : vb11, vb12, vb13, vb14, vb15
    Pour ID = 2 : vb21, vb22, vb23, vb24, vb25
    ...
    Pour ID = i : vbi1, vbi2, vbi3, vbi4, vbi5
    ...
    Pour ID = n : vbn1, vbn2, vbn3, vbn4, vbn5

    Alors que selon ta requête, pour ID = i on produirait plutôt vbi.

    P.-S. J’ai essayé ta requête avec SQL Server 2008 lequel annonce : « Syntaxe incorrecte vers le mot clé 'AS'. »
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #23
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Cette fois-ci, avec la colonne IdRel , on aura numéroté les lignes relativement à la colonne ID. Pour réaliser cette opération, les cracks de SQL sauront vous conseiller, en utilisant des fonctions ad-hoc (RowId(), ... ?), ou un trigger, sinon ça sera la méthode bourrin (parcours de la table SOURCE par curseur, pour alimenter la table SOURCE2).
    En fait, l'instruction permettant de peupler la table SOURCE2 se code de façon simple :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO SOURCE2
        SELECT ID, ROW_NUMBER()  OVER (PARTITION BY ID ORDER BY vb), vb 
    FROM   SOURCE ;
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  4. #24
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    En effet,

    Du coup, on peut même se passer de cette table (SOURCE2) en la mettant directement en CTE, et faire la mise à jour ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    WITH CTE AS (
    	SELECT ID, ROW_NUMBER()  OVER (PARTITION BY ID ORDER BY vb) AS N, vb 
    	FROM   SOURCE
    )
    UPDATE C
    	SET	vb1 = [1]
    	,	vb2 = [2]
    	,	vb3 = [3]
    	,	vb4 = [4]
    	,	vb5 = [5]	
    FROM CIBLE C
    INNER JOIN CTE PIVOT(MAX(vb) FOR N IN([1], [2], [3], [4], [5])) P
    	ON P.ID = C.ID
    Mais effectivement, il faudra songer a revoir le modèle !

  5. #25
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    OK aieeeuuuuu, vous avez été plus rapide, mais abondance de biens ne nuit point...


    Voici ce que j'avais prévu :


    Reprise de la séquence, en pouvant cette-fois-ci utiliser une vue :


    TABLE CIBLE
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE CIBLE 
    (
            ID              INT             NOT NULL
          , vb1             VARCHAR (4)                  
          , vb2             VARCHAR (4)      
          , vb3             VARCHAR (4)                  
          , vb4             VARCHAR (4)                  
          , vb5             VARCHAR (4)                  
        , CONSTRAINT CIBLE_PK PRIMARY KEY (ID)                    
    ) ;


    TABLE SOURCE
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE SOURCE 
    (
            K               INT             NOT NULL 
          , ID              INT             NOT NULL
          , vb              VARCHAR (4)     NOT NULL  
        , CONSTRAINT SOURCE_PK PRIMARY KEY (K)             
    ) ;

    Utilisation d’une vue qu’on peut nommer SOURCE2 :


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE VIEW SOURCE2 (ID, IdRel, vb) AS
        SELECT ID, ROW_NUMBER()  OVER (PARTITION BY ID ORDER BY vb), vb
        FROM   SOURCE ;

    Mise à jour de la cible :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE CIBLE 
        SET vb1 = (SELECT vb FROM SOURCE2 WHERE CIBLE.ID = SOURCE2.ID AND IdRel = 1) 
          , vb2 = (SELECT vb FROM SOURCE2 WHERE CIBLE.ID = SOURCE2.ID AND IdRel = 2) 
          , vb3 = (SELECT vb FROM SOURCE2 WHERE CIBLE.ID = SOURCE2.ID AND IdRel = 3)
          , vb4 = (SELECT vb FROM SOURCE2 WHERE CIBLE.ID = SOURCE2.ID AND IdRel = 4)
          , vb5 = (SELECT vb FROM SOURCE2 WHERE CIBLE.ID = SOURCE2.ID AND IdRel = 5)


    aieeeuuuuu, votre solution est de toute façon la plus élégante
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  6. #26
    Futur Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Novembre 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 17
    Points : 7
    Points
    7
    Par défaut
    Merci de votre aide

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [2008] avis sur Microsoft® SQL Server® 2008 Management Studio Express
    Par fahdijbeli dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 13/09/2013, 07h43
  2. Réponses: 4
    Dernier message: 05/04/2011, 08h32
  3. Requête paramètrer sur table SQL Server 2000
    Par Andry dans le forum Bases de données
    Réponses: 4
    Dernier message: 21/06/2007, 11h24
  4. Boucle while avec action sur table SQL
    Par kamikazbe dans le forum JDBC
    Réponses: 4
    Dernier message: 01/06/2007, 11h46
  5. URGENT: tri sur table SQL
    Par clairette dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h53

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