Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Compteur

18 réponses
Avatar
Gloops
Bonjour tout le monde,

Pardonnez le niveau de la question, mais j'ai modifi=E9 un champ entier=20
pour y cr=E9er un compteur, et dans un nouvel enregistrement je m'aper=E7=
ois=20
que sa valeur par d=E9faut est toujours Null. Pour une cl=E9 primaire, c'=
est=20
g=EAnant. Est-ce moi qui n'ai pas assur=E9 ?

Pendant que je suis l=E0 : auriez-vous une bonne adresse (de site web,=20
peut-=EAtre) =E0 me conseiller pour (quasiment) d=E9marrer sur l'=E9tude =
de TSQL=20
? Avant de me rendre compte que le moyen =E9tait probablement=20
surdimensionn=E9, j'ai essay=E9 de cr=E9er un trigger, pour lors de la=20
cr=E9ation d'un enregistrement, donner au champ num=E9ro la valeur=20
MAX(Numero) + 1. Le seul commentaire que m'a fait le syst=E8me (en fait=20
SSMSE) est que la formule n'=E9tait pas bonne. Bon, je veux bien, moi. Si=
=20
il y avait moyen de d=E9velopper un peu ... Dans l'aide, le sommaire est =

int=E9ressant : je ne trouve gu=E8re que l'aide de l'aide, en Fran=E7ais =
et en=20
Anglais.

Ah au fait si je veux que l'utilisateur puisse modifier les valeurs des=20
num=E9ros, apr=E8s coup, finalement le trigger serait mieux que le compte=
ur,=20
peut-=EAtre ?

8 réponses

1 2
Avatar
Gloops
Gloops a écrit, le 13/12/2009 00:55 :
Oui, c'est bien ce que j'en ai compris cet après-midi en lisant l'aid e
sur le conseil de Michel.

D'ailleurs, je me rends compte que je n'avais pas prêté attention à la
remarque sur SQL-DMO Identity, qui, j'en ai l'impression, me réserve
encore un peu de lecture pour demain.
______________________________________
Patrice a écrit, le 12/12/2009 20:24 :
Bonjour,

Le compteur est géré de base par SQL Server via le mot clef IDENTI TY
appliqué à la colonne concernée. Voir :
http://msdn.microsoft.com/fr-fr/library/ms186775.aspx

--
Patrice






Avatar
Gloops
Gloops a écrit, le 13/12/2009 00:55 :
D'ailleurs, je me rends compte que je n'avais pas prêté attention à la
remarque sur SQL-DMO Identity, qui, j'en ai l'impression, me réserve
encore un peu de lecture pour demain.



J'ai quand même l'impression que la nuance est un peu subtile.

Voilà ce que j'ai compris :
- le compteur sur une colonne peut avoir la propriété Identity, auque l
cas il servira à désigner chaque enregistrement
- la colonne peut avoir la propriété Identity et ainsi servir à dé signer
chaque enregistrement, auquel cas SQL Server gérera un compteur dessus
- il ne faut SURTOUT PAS confondre les deux.

J'ai à peu près aussi bien compris la différence que, avant que je sache
ce que c'est qu'une souris, quand on m'a dit que "la commande COMMAND
ouvre une nouvelle occurrence de l'interpréteur de commandes". Ce
jour-là (ça ne nous rajeunit pas) j'ai demandé à Madame Michu, qu i était
à côté de moi dans la salle de cours de vulgarisation, elle n'a pas su
m'expliquer.
Avatar
Patrice
>Voilà ce que j'ai compris :
- le compteur sur une colonne peut avoir la propriété Identity, auquel cas
il servira à désigner chaque enregistrement
- la colonne peut avoir la propriété Identity et ainsi servir à désigner
chaque enregistrement, auquel cas SQL Server gérera un compteur dessus
- il ne faut SURTOUT PAS confondre les deux.



Je pinaille sans doute un peu mais je verrais plutôt les choses dans l'autre
sens :
- ce n'est pas parce que c'est IDENTITY que cela sert à identifier une ligne
et que SQL Server génère donc un compteur
- parce que c'est IDENTITY, c'est un compteur et comme c'est un compteur
cela identifie chaque ligne.

Il est possible d'identifier chaque ligne sans compteur (et donc sans
colonne IDENTITY) en utilisant une contrainte PRIMARY KEY.

Je pense que la remarque sur SQL-DMO dans la doc embrouille plus qu'autre
chose (à mon avis ils veulent juste dire que dans un cas c'est un mot-clé
qui permet d'indiquer éventuellement la valeur initiale et l'incrément
tandis que dans l'autre cas c'est une propriété qui retourne vrai/faux qui
indique si la colonne est ou non un compteur).
--
Patrice
Avatar
Patrice
Une petite précision d'ordre pratique : lorsqu'on déclare une table on
précise d'ailleurs les deux :

CREATE TABLE tmpParent(
pk INT IDENTITY NOT NULL PRIMARY KEY,
Data VARCHAR(10) NOT NULL)
GO

IDENTITY indique que la colonne pk est géré comme un compteur, et la
contrainte PRIMARY KEY indique explicitement que ce compteur servira à
identifier chaque ligne de façon unique...
--
Patrice
Avatar
Gloops
Patrice a écrit, le 13/12/2009 14:46 :
Je pense que la remarque sur SQL-DMO dans la doc embrouille plus
qu'autre chose (à mon avis ils veulent juste dire que dans un cas c'e st
un mot-clé qui permet d'indiquer éventuellement la valeur initiale et
l'incrément tandis que dans l'autre cas c'est une propriété qui r etourne
vrai/faux qui indique si la colonne est ou non un compteur).



Ah, l'un est automatique, tandis que l'autre peut recevoir un petit coup
de tournevis si on veut affiner les paramètres ?

Il est vrai que dans l'interface utilisateur de MSSMSE j'ai bien vu une
zone compteur et une zone identité, et les deux sont liées. En
comprenant bien les deux notions j'imagine qu'on se sert mieux de
l'interface.
Avatar
Gloops
Patrice a écrit, le 13/12/2009 14:57 :
Une petite précision d'ordre pratique : lorsqu'on déclare une table on
précise d'ailleurs les deux :

CREATE TABLE tmpParent(
pk INT IDENTITY NOT NULL PRIMARY KEY,
Data VARCHAR(10) NOT NULL)
GO

IDENTITY indique que la colonne pk est géré comme un compteur, et l a
contrainte PRIMARY KEY indique explicitement que ce compteur servira à
identifier chaque ligne de façon unique...
--
Patrice





Ah oui j'allais proposer de mettre PRIMARY KEY sur un champ et IDENTITY
sur un autre, histoire de vérifier qu'on se fait jeter ... mais c'est
que dans l'exemple que tu donnes il s'agit d'attributs d'un index, et
non de champs de la table. Ah ben il y a de quoi se muscler le neurone,
avec ça :)
Avatar
Fred BROUARD
Gloops a écrit :
EmanuelL a écrit, le 11/12/2009 23:30 :
Salut Gloops,

Pour la documentation de T-SQL, regardes ici :
http://sqlpro.developpez.com/



En effet, peut-être pas vraiment spécifique à T-SQL toutefois ?



Celle là l'est :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/
En particulier pour ce qui vous concerne :
http://blog.developpez.com/sqlpro/p6135/ms-sql-server/auto-increment-identity-avec-sql-server/

Alors j'ai mis ça en ½uvre :

CREATE TRIGGER TRG_INS_BEF_SitesRech
ON dbo.tabSitesRecherche
UPDATE NEW
SET Numero = MAX(Numero) + 1



ça c'est la pire des choses comme je le dis ici :
http://sqlpro.developpez.com/cours/clefs/

A +


et je me fais jeter :
Msg 156, Niveau 15, État 1, Procédure TRG_INS_BEF_SitesRech, Ligne 3
Incorrect syntax near the keyword 'UPDATE'.

Si je mets le curseur sur NEW et que j'appuie sur F1, je me retrouve
avec l'aide du mot-clef new dans le langage C++, alors qu'habituellement
je développe en C# et que j'ai paramétré MSDN en conséquence.

Du coup j'apprécie particulièrement le sommaire de l'aide, divisé en
deux rubriques principales :
- aide sur l'aide
- help on help

Peut-être vais-je devoir effectivement chercher là-dedans ce qui a
évolué, pour pouvoir arriver sur l'aide de T-SQL.

En partant de UPDATE j'arrive bien dans l'aide de T-SQL, mais les
paramètres de UPDATE ne comportent pas de mot-clef NEW, ce qui
vraisemblablement explique qu'on me retourne une erreur dessus.
D'ailleurs, j'avais lu l'aide de UPDATE avant de poser ma question.
Pas assez attentivement peut-être ?


Peux-tu nous mettre le script de la création de cette table?



//sans le compteur :

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tabSitesRecherche](
[Numero] [int] IDENTITY(1,1) NOT NULL,
[NomSite] [nchar](40) NULL,
[AvantArgu] [nchar](60) NULL,
[ApresArgu] [nchar](60) NULL,
CONSTRAINT [PK_tabSitesRecherche] PRIMARY KEY CLUSTERED
(
[Numero] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY =
OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
Avatar
Gloops
Oh, on dirait bien que voilà quelqu'un de bien documenté :)
Merci. Euh, là, je vais me faire un petit somme.

Je vais bien trouver un moment pour regarder ça.
___________________________________________
Fred BROUARD a écrit, le 13/12/2009 18:00 :
Gloops a écrit :
EmanuelL a écrit, le 11/12/2009 23:30 :
Salut Gloops,

Pour la documentation de T-SQL, regardes ici :
http://sqlpro.developpez.com/



En effet, peut-être pas vraiment spécifique à T-SQL toutefois ?



Celle là l'est :
http://sqlpro.developpez.com/cours/sqlserver/transactsql/
En particulier pour ce qui vous concerne :
http://blog.developpez.com/sqlpro/p6135/ms-sql-server/auto-increment-id entity-avec-sql-server/


Alors j'ai mis ça en ½uvre :

CREATE TRIGGER TRG_INS_BEF_SitesRech
ON dbo.tabSitesRecherche
UPDATE NEW
SET Numero = MAX(Numero) + 1



ça c'est la pire des choses comme je le dis ici :
http://sqlpro.developpez.com/cours/clefs/

A +


et je me fais jeter :
Msg 156, Niveau 15, État 1, Procédure TRG_INS_BEF_SitesRech, Ligne 3
Incorrect syntax near the keyword 'UPDATE'.

Si je mets le curseur sur NEW et que j'appuie sur F1, je me retrouve
avec l'aide du mot-clef new dans le langage C++, alors
qu'habituellement je développe en C# et que j'ai paramétré MSDN en
conséquence.

Du coup j'apprécie particulièrement le sommaire de l'aide, divisé en
deux rubriques principales :
- aide sur l'aide
- help on help

Peut-être vais-je devoir effectivement chercher là-dedans ce qui a
évolué, pour pouvoir arriver sur l'aide de T-SQL.

En partant de UPDATE j'arrive bien dans l'aide de T-SQL, mais les
paramètres de UPDATE ne comportent pas de mot-clef NEW, ce qui
vraisemblablement explique qu'on me retourne une erreur dessus.
D'ailleurs, j'avais lu l'aide de UPDATE avant de poser ma question.
Pas assez attentivement peut-être ?


Peux-tu nous mettre le script de la création de cette table?



//sans le compteur :

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tabSitesRecherche](
[Numero] [int] IDENTITY(1,1) NOT NULL,
[NomSite] [nchar](40) NULL,
[AvantArgu] [nchar](60) NULL,
[ApresArgu] [nchar](60) NULL,
CONSTRAINT [PK_tabSitesRecherche] PRIMARY KEY CLUSTERED
(
[Numero] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP _KEY
= OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMAR Y]
) ON [PRIMARY]







1 2