Salut,
Est-il possible d'avoir une champ calculé dont le type serait une table ?
Merci
Salut,
Est-il possible d'avoir une champ calculé dont le type serait une table ?
Merci
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/ * * * * *
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 ?
@++![]()
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
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/ * * * * *
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 :
La vue :
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 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 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
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
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
Voir le résultat :
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;
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 SELECT * FROM V_PERSONNE_TELEPHONE
Voir le résultat :
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;
Troisième exemple : Suppression d'une personne et ses téléphones
Code : Sélectionner tout - Visualiser dans une fenêtre à part SELECT * FROM V_PERSONNE_TELEPHONE
Vous pouvez aussi faire cela en JSON avec la version 2016 de SQL Server...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 DELETE FROM T_PERSONNE_PRS WHERE PRS_ID = 1
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/ * * * * *
Partager