bonjour,
je suis entrain de créer mes tables sur sql server 2005 , est ce que c'est possible d'avoir ds une table une colonne calculer a partire d'autre colonne de la même table ( + / * - )
mecri
bonjour,
je suis entrain de créer mes tables sur sql server 2005 , est ce que c'est possible d'avoir ds une table une colonne calculer a partire d'autre colonne de la même table ( + / * - )
mecri
Je ne sais pas si cela est possible ou non lors de la definition de la table.
Par contre ca doit etre facilement faisable avec un update.
Tu peux aussi penser à un trigger on insert, et update, qui te met ta colonne à jour pour en live.
Cependant, je ne te conseillerai aucune de ces solutions car ca ne ferait qu'allourdir et ralentir ta db.
Pourquoi ne pas calculer cette valeur au moment de ta requete ?
j ai le mm problemke toi pauvrmen " j aime bien ton pseudi"
en fait ds plusieu ds une table je dois avoir la somme de deux colone de la même table,,, merci de me dire la solution car ca va me rendre dinge cette table..
merci
Bonjour,
Il serait fort aimable à certains d'écrire en français.
Deux cas pour nos colonnes "calculées" :
- La colonne "calculée" est dans une autre table que la table qui sert à calculer : dans ce cas, lors de la mise à jour de la table par la procédure stockée, il suffit de rajouter du code pour faire le calcul de la valeur et réaliser l'UPDATE dans la seconde table. Cela n'alourdit en aucun cas le traitement, il faut simplement écrire proprement sa requête de mise à jour et vérifier que les bons indexes sont présents.
- La colonne vraiment calculée : c'est une colonne qui fait partie de la table et dont la valeur est calculée avec d'autres colonnes de la table. Dans ce cas, c'est lors de la creation de la table que l'on définit la formule de calcul :
L'option PERSISTED permet de stocker physiquement les valeurs calculées dans la table et mettra à jour les valeurs lorsque n'importe quelle colonne dont dépend la colonne calculée est mise à jour.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE TABLE maTable ( MaColonneA INT NOT NULL, MaColonneB INT NOT NULL, MaColonneCalculee INT AS (MAColonneA + MaColonneB) PERSISTED ); GO
A+
bonjour,
merci pour vos reponses
voila l ecris ce code
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 USE [sami] GO /****** Object: Table [dbo].[Table_1] Script Date: 05/02/2008 11:02:07 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Table_1]( [P1] [nchar](10) NOT NULL, [A] [int] NULL, [B] [int] NULL, [C] [int] AS ([B]+[A]) PERSISTED, ) GO CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED ( [P1] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]& ) ON [PRIMARY]
ou il ya l erreur merci
Vous pouvez faire des colonnes calculées dans SQL Server 2005 :
- à la volée
- pertistante
- indexées
Exemple :
A +
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CREATE TABLE T (COL1 INT, COL2 INT, COLCALC AS COL1 + COL2, COLCALC_PERSISTANTE AS COL1 - COL2 PERSISTED, COLCALC_PERSISTANTE_INDEXEE AS COL1 * COL2); GO CREATE INDEX X ON T (COLCALC_PERSISTANTE_INDEXEE); GO
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/ * * * * *
merci pour ta reponse
voila j ai fai ce code
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 USE [fahmi] GO /****** Object: Table [dbo].[Table_4] Script Date: 05/02/2008 14:52:02 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Table_4] ([A] INT, [B] INT, [C] AS COL1 + COL2, GO CREATE INDEX X ON T ([C]_PERSISTANTE_INDEXEE); GO [lmlml] [nchar](10) NULL ) ON [PRIMARY]
ensuite j ai eu ce message
Msg 102, Level 15, State 1, Line 4
Incorrect syntax near ','.
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '_PERSISTANTE_INDEXEE'.
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '10'.
j 'avance vraiment pas merci pour votre aide
Bonjour,
L'instructionest une erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 [lmlml] [nchar](10) NULL ) ON [PRIMARY]
En revanche la table Table_4 et l'index X doivent exister
Excusez moi, mais commencez par apprendre le SQL, parce que là c'est assez navrant de devoir rectifier toutes vos erreurs.
SQL est un langage de programmation normalisé utilisé dans 3 programmes informatiques sur 4 !
Mon site web comme mes bouquins peuvent vous y aider.
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 me demande à quoi cela sert de stocker le résultat...
Ne serait-ce pas plus opportun de créer une vue qui calculerait la colonne ?
Exemple :
Il me semble que si ta nouvelle colonne peut s'obtenir sur base des données provenant d'autres colonnes, il est inutile de stocker le résultat.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SELECT PrixAchat, FraisDivers, (PrixAchat + FraisDivers) * TauxBenefSouhaite) As PrixVente FROM tbl_Articles
Je ne suis pas expert mais je pense que cela n'aura pas d'impact sur l'optimisation : lire les données du disque ou calculer le résultat devrait avoir un impact identique.
C'est juste un avis.
Christophe (cavo789)
Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
Si votre colonne calculée est persistante, cela stocke en permanence le calcul. Ceci améliore notablement les vitesse en lecture puisqu'il n'y a plus de calculs à faire ligne à ligne.
Si de plus vous indexez cette colonnes, alors cela améliore en sus les recherches.
Tout dépends le niveau d'optimisation que l'on souhaite.
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/ * * * * *
désolé je n arrive pas a calculé ma colonne , peut etre ke j ecris pas le code ds le bon endroi
est ce que vous pouvez me guider pour y arriver
ps : j travail avec sql server 2005
merci
voila j ecris ce code pour créer une table mais j'ai un message comme quoi il des erreurs,, j'ai cherché longtemsp mais j arrive pas a résoudre mon probleme..
dans ma table j'ai 4 colonnes calculé
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 REATE TABLE duration_estimate ( ID_project varchar NOT NULL, duration estimate PH_0 int NULL, duration estimate PH_1 int NULL, duration estimate PH_2 int NULL, duration estimate PH_3 int NULL, duration Estimate at completion int NULL, variance PH_0 AS ((( duration Estimate at completion / duration estimate PH_0) - 1) * 100) PERSISTED, variance PH_1 AS ((( duration Estimate at completion / duration estimate PH_1) - 1) * 100) PERSISTED, variance PH_2 AS ((( duration Estimate at completion / duration estimate PH_2) - 1) * 100) PERSISTED, variance PH_3 AS ((( duration Estimate at completion / duration estimate PH_3) - 1) * 100) PERSISTED, ); GO
merci de votre aide
les noms des objets d'une base répondent à la norme SQL :
pas de blanc de caractères diacritique (accents, cédille...) par de signe de ponctuation !
Bref des lettres, des chiffres et le blanc souligné !
Lisez ceci : http://sqlpro.developpez.com/cours/s...age=partie1#L1
Comment voulez vous qu'il comprenne ce que vous luis dite. Vous ne faites pas du SQL vous faites du Javaniais!!!
donc, rectifions comme ceci :
Notez qu'un VARCHAR se dimensionne : mettez ce que vous voulez, mais mettez quelque chose. Comme je suppose que c'est la clef il faut mettre le moins long possible...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ID_project varchar(???) NOT NULL, duration_estimate_PH_0 int NULL, duration_estimate_PH_1 int NULL, duration_estimate_PH_2 int NULL, duration_estimate_PH_3 int NULL, duration_estimate_at_completion int NULL, variance_PH_0 AS ((( duration_Estimate_at_completion / duration_estimate_PH_0) - 1) * 100) PERSISTED, variance_PH_1 AS ((( duration_Estimate_at_completion / duration_estimate_PH_1) - 1) * 100) PERSISTED, variance_PH_2 AS ((( duration_Estimate_at_completion / duration_estimate_PH_2) - 1) * 100) PERSISTED, variance_PH_3 AS ((( duration_Estimate_at_completion / duration_estimate_PH_3) - 1) * 100) PERSISTED,
Le problème que vous allez maintenant avoir c'est que vos variances vont apparaître en nombres entiers... Si vous voulez des nombres à virgule, il faut "caster" toutes les colonnes de l'expression calculée :
Enfin, votre table est ANORMALE, c'est à dire pas normalisé. Vous ne respectez pas la première forme normale. Vos requêtes SELECT seront difficile à écrire et vos performances en matière de requêtes vont être de plus en plus lamentable au fur et a mesure que vous allez avoir une montée en charge.
Code : Sélectionner tout - Visualiser dans une fenêtre à part ((( CAST(duration_Estimate_at_completion AS FLOAT) / CAST(duration_estimate_PH_3 AS FLOAT)) - 1.0 ) * 100.0)
Voici main,tenant la version normalisée de votre bousin :
Maintenant faites ce que vous voulez... Plus vous ferez n'importe quoi, plus je gagnerais ma vie : je fais des audits de base de données dont les performances sont catastrophiques à 2000 € jour et cela me permet de vendre quelques dizaines de jours de prestation ensuite pour rectifier le tir !!!
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 CREATE TABLE dbo.T_duration_DUR (DUR_ID_project varchar(32) NOT NULL PRIMARY KEY, DUR_estimate_at_completion int NULL); GO CREATE TABLE dbo.T_duration_estimate_DES (DUR_ID_project varchar(32) NOT NULL FOREIGN KEY REFERENCES T_duration_DUR (DUR_ID_project), DES_PH int NOT NULL CONSTRAINT PK_DES PRIMARY KEY (DUR_ID_project, DES_PH), DES_duration_estimate int NULL); GO CREATE VIEW dbo.V_duration_estimate_DES WITH SCHEMABINDING AS SELECT DUR.DUR_ID_project, DES_PH, DUR_estimate_at_completion, DES_duration_estimate, (CAST(DUR_estimate_at_completion AS DECIMAL(16,2)) / CAST(DES_duration_estimate AS DECIMAL(16,2)) - 1.0 ) * 100.0 AS DES_variance_PH FROM dbo.T_duration_DUR AS DUR INNER JOIN dbo.T_duration_estimate_DES AS DES ON DUR.DUR_ID_project = DES.DUR_ID_project GO CREATE UNIQUE CLUSTERED INDEX X_V_DES_PK ON dbo.V_duration_estimate_DES (DUR_ID_project, DES_PH) GO
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/ * * * * *
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager