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 :

Champ table dans une table ? [2012]


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 264
    Par défaut Champ table dans une table ?
    Salut,

    Est-il possible d'avoir une champ calculé dont le type serait une table ?

    Merci

  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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Il n'y a pas de type "table".

    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
    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 : 44
    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
    Par défaut
    Bonjour,

    En effet les nested tables n'existent pas dans SQL Server.
    Pourriez-vous nous préciser votre besoin ? Par exemple, est-ce pour stocker une série de valeurs ?

    @++

  4. #4
    Membre éclairé Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 264
    Par défaut
    En fait c'était pour pouvoir passer en paramètre d'une proc, entete, détail, du style facture/lignes.
    Je pense pouvoir le faire avec du json, non ?
    Il y a un interpréteur de json dans SQL Server ?
    Merci

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Effectivement il y a possibilité de manipuler du JSON dans SQL Server... Mais je trouve cette approche particulièrement débile !

    En effet une base de données relationnelle étant faite pour structurer les données, pourquoi ne pas les structurer par le modèle de données ?

    C'est a peu près comme si vous preniez une petite cuillère pour effectuer le terrassement des fondations d'un gratte ciel !!!!!

    Je sais bien que le JSON est à la mode... Et quand la burka sera à la mode... Vous la mettrez aussi ?

    Quel est votre besoin précis ?

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

  6. #6
    Membre éclairé Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 264
    Par défaut
    Je suis débile mais je me soigne...

    En fait, le client veut qu'on utilise QUE des procédures stockées. L'objectif était de Sringifier un formulaire bulk et de passer directement le JSon à la proc.
    Comme on doit utiliser Entity Framework en Database first, l'idée était de créer un schéma qui ne contiendrait que des tables vides qui seraient les signatures des entrées sorties des procs pour que lors de la génération des classes à partir de l'EDMX ça nous crée les classes d'entrées sorties directement à partie de la base.

    Je sais c'est sans doute moche mais on a 6 mois pour faire 2 ans de dev, donc, chaque seconde économisée compte...

    Merci pour on aide.

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Nadinette Voir le message
    Je suis débile mais je me soigne...

    En fait, le client veut qu'on utilise QUE des procédures stockées. L'objectif était de Sringifier un formulaire bulk et de passer directement le JSon à la proc.
    Comme on doit utiliser Entity Framework en Database first, l'idée était de créer un schéma qui ne contiendrait que des tables vides qui seraient les signatures des entrées sorties des procs pour que lors de la génération des classes à partir de l'EDMX ça nous crée les classes d'entrées sorties directement à partie de la base.

    Je sais c'est sans doute moche mais on a 6 mois pour faire 2 ans de dev, donc, chaque seconde économisée compte...

    Merci pour on aide.
    Utiliser des procédures stockées va réduire considérablement le temps de dev... Au moins 60% voire plus... C'est donc une excellente approche.

    Ne pas modéliser correctement sera la pire des conneries !

    Il suffit de créer des vues (qui assure le R de READ dans le CRUD) et une procédure pour l'INSERT et l'UPDATE (tu as le C et le U du CRUD) et lmettre en place l'intégrité référentielle en mode cascade pour le DELETE.

    Donc, des tables, synthétisées par des vues avec 1 seule procédure.... C'est pas énorme !

    Un exemple :

    Les tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE T_PERSONNE_PRS
    (PRS_ID         INT IDENTITY NOT NULL PRIMARY KEY,
     PRS_NOM        CHAR(32) NOT NULL,
     PRS_PRENOM     VARCHAR(25));
    GO
     
    CREATE TABLE T_TELEPHONE_TEL
    (TEL_ID         INT IDENTITY NOT NULL,
     PRS_ID         INT NOT NULL REFERENCES T_PERSONNE_PRS (PRS_ID) ON DELETE CASCADE,
     TEL_NUMERO     CHAR(20));
    GO
    La vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE VIEW V_PERSONNE_TELEPHONE
    AS
    SELECT P.*, TEL_ID, TEL_NUMERO
    FROM   T_PERSONNE_PRS AS P
           LEFT OUTER JOIN T_TELEPHONE_TEL AS T
    	        ON P.PRS_ID = T.PRS_ID
    GO
    La procédure qui fait les INSERT et UPDATE dans les 2 tables :
    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
    CREATE PROCEDURE P_IU_PERSONNE 
           @PRS_ID        INT            OUTPUT,
    	   @PRS_NOM       CHAR(32),
    	   @PRS_PRENOM    VARCHAR(25),
    	   @TELS          XML
    AS
    SET NOCOUNT ON;
     
    -- Insert ou UPDATE dans personne
    MERGE INTO T_PERSONNE_PRS AS cible
    USING (SELECT @PRS_ID AS PRS_ID) AS data
       ON cible.PRS_ID = data.PRS_ID
    --> Si @PRS_ID n'est pas NULL, alors UPDATE
    WHEN MATCHED 
    THEN UPDATE 
    	 SET    PRS_NOM = @PRS_NOM,
    	        PRS_PRENOM = @PRS_PRENOM
    --> sinon INSERT
    WHEN NOT MATCHED 
    THEN INSERT (PRS_NOM, PRS_PRENOM)
    	 VALUES (@PRS_NOM, @PRS_PRENOM);
    SET @PRS_ID = COALESCE(@PRS_ID, SCOPE_IDENTITY());
     
    --> pour le lot de téléphones, déplier le XML. Si présence de TEL_ID alors UPDATE sinon INSERT
    MERGE INTO T_TELEPHONE_TEL AS cible
    USING (SELECT @PRS_ID AS PRS_ID, 
                  T.N.value('(./id[1])', 'INT') AS TEL_ID,
                  T.N.value('(./num[1])', 'CHAR(20)') AS TEL_NUM
           FROM   @TELS.nodes('/tels/tel') AS T(N)) AS data
    	   ON cible.TEL_ID = data.TEL_ID
    WHEN MATCHED
    THEN UPDATE 
         SET PRS_ID = data.PRS_ID,
    		 TEL_NUMERO = data.TEL_NUM   
    WHEN NOT MATCHED
    THEN INSERT (PRS_ID, TEL_NUMERO)
         VALUES (data.PRS_ID, data.TEL_NUM);
     
    GO
    Un exemple : insertion d'une personne avec 2 tel :
    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
    DECLARE @ID INT
    EXEC P_IU_PERSONNE 
                @ID OUTPUT, 
    			'DUPONT', 
    			'Alain', 
                '<tels>
                  <tel>
    			     <id></id>
    				 <num>0656432378</num>
    			  </tel>
    			  <tel>
    			     <id></id>
    				 <num>0123456789</num>
    			  </tel>
    			</tels>';
    SELECT @ID AS ID_PRS_INSERT;
    Voir le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM V_PERSONNE_TELEPHONE
    Deuxième exemple : modification d'une personne avec ajout d'un téléphone et update de l'autre
    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
    DECLARE @ID INT;
    SET @ID = 1
    EXEC P_IU_PERSONNE 
                @ID OUTPUT, 
    			'DUPOND', 
    			'Alain', 
                '<tels>
                  <tel>
    			     <id></id>
    				 <num>0900554433</num>
    			  </tel>
    			  <tel>
    			     <id>1</id>
    				 <num>0199887766</num>
    			  </tel>
    			</tels>';
    SELECT @ID AS ID_PRS_INSERT;
    Voir le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM V_PERSONNE_TELEPHONE
    Troisième exemple : Suppression d'une personne et ses téléphones
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE FROM T_PERSONNE_PRS
    WHERE  PRS_ID = 1
    Vous pouvez aussi faire cela en JSON avec la version 2016 de SQL Server...

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

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Effectivement il y a possibilité de manipuler du JSON dans SQL Server... Mais je trouve cette approche particulièrement débile !
    J'ai un exemple de xml compressé stocké dans un champs text...

  9. #9
    Membre éclairé Avatar de Nadinette
    Femme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2012
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 264
    Par défaut
    Merci, je vais étudier ça.

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

Discussions similaires

  1. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 14h29
  2. [ORACLE] Copie d'une table dans une table temporaire
    Par david71 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/08/2007, 11h23
  3. Réponses: 5
    Dernier message: 27/07/2007, 16h21
  4. Comment créer une table dans une table ?
    Par Invité dans le forum Débuter
    Réponses: 8
    Dernier message: 15/06/2007, 14h55
  5. Réponses: 7
    Dernier message: 21/08/2006, 16h27

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