Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/05/2011, 02h40   #1
Invité régulier
 
Femme Touta
Étudiant
Inscription : mai 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Femme Touta
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 21
Points : 7
Points : 7
Par défaut incrémentation automatique d'une colonne

* Bonjour, *

j'ai crée une table programme sous SQL Server et je cherche a modifier la colonne numprg pour qu'elle soit incrémenté automatiquement..bon j'ai lu cet article http://blog.developpez.com/sqlpro/p6...ec-sql-server/ mais j'ai pas trouvé qu'est ce qu'on doit écrire avec Alter table pas Create table.
j'ai essayé avec
Code :
ALTER TABLE programme ALTER COLUMN Numprg int IDENTITY;
mais un erreur se produit.
merci d'avance..
touta89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 07h57   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

Effectivement c’est impossible, et c'est tout à fait normal : on ne peut pas demander tout d'un coup à SQL Server de calculer la valeur, puis de ne plus la calculer, puis de recommencer à la calculer, ...

Vous avez trois solutions :

- Soit la table ne contient aucune ligne et n'est référencée par aucune autre, et vous la recréez

- Soit dans le même cas, vous faites un clic droit sur la table > conception, et vous spécifiez que cette colonne doit avoir la propriété d'auto-incrémentation



Et vous laissez faire SQL Server Management Studio, qui recréera la table

- Soit votre table a des lignes et elle est référencée par d'autres tables, et là c'est pas un cadeau : il vous faut désactiver toutes les contraintes sur toutes les tables qui référencent celle-ci, ce que vous pouvez vous générer en exécutant :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT		'ALTER TABLE ' + PS.name + '.' + PT.name
		+ ' NOCHECK CONSTRAINT ' + FK.name AS foreign_key_name
FROM		sys.schemas AS PS
INNER JOIN	sys.foreign_keys AS FK
			ON PS.schema_id = FK.schema_id
INNER JOIN	sys.foreign_key_columns AS FKC
			ON FK.object_id = FKC.constraint_object_id
INNER JOIN	sys.TABLES AS PT
			ON FK.parent_object_id = PT.object_id
INNER JOIN	sys.COLUMNS AS PC
			ON FKC.parent_object_id = PC.object_id
			AND FKC.parent_column_id = PC.column_id
INNER JOIN	sys.TABLES AS RT
			ON FK.referenced_object_id = RT.object_id
INNER JOIN	sys.COLUMNS AS RC
			ON FKC.referenced_object_id = RC.object_id
			AND FKC.referenced_column_id = RC.column_id
INNER JOIN	sys.schemas AS RS
			ON RT.schema_id = RS.schema_id
WHERE		1 = 1
AND		RS.name = 'dbo'
AND		RT.name = 'programme '
Puis recréer votre table avec la propriété d'auto-incrémentation pour la colonne Numprg, puis réactiver toutes les contraintes.
Pour générer le code de réactivation :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT		'ALTER TABLE ' + PS.name + '.' + PT.name
		+ ' WITH CHECK CHECK CONSTRAINT ' + FK.name AS foreign_key_name
FROM		sys.schemas AS PS
INNER JOIN	sys.foreign_keys AS FK
			ON PS.schema_id = FK.schema_id
INNER JOIN	sys.foreign_key_columns AS FKC
			ON FK.object_id = FKC.constraint_object_id
INNER JOIN	sys.TABLES AS PT
			ON FK.parent_object_id = PT.object_id
INNER JOIN	sys.COLUMNS AS PC
			ON FKC.parent_object_id = PC.object_id
			AND FKC.parent_column_id = PC.column_id
INNER JOIN	sys.TABLES AS RT
			ON FK.referenced_object_id = RT.object_id
INNER JOIN	sys.COLUMNS AS RC
			ON FKC.referenced_object_id = RC.object_id
			AND FKC.referenced_column_id = RC.column_id
INNER JOIN	sys.schemas AS RS
			ON RT.schema_id = RS.schema_id
WHERE		1 = 1
AND		RS.name = 'dbo'
AND		RT.name = 'programme'
Le code est inspiré de la requête que j'ai publié ici

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/05/2011, 13h28   #3
Invité régulier
 
Femme Touta
Étudiant
Inscription : mai 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Femme Touta
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 21
Points : 7
Points : 7
Par défaut remerciement

merci bien pour ton aide ça marche pour la colonne NumPrg mais j'ai une autre colonne NumPc dans une table PièceComptable qui doit étre incrémentée mensuellement selon le RibRip.

par exemple:

mois----------------RibRip-------------NumPc
Janvier------------- 012345------------ 1
Janvier------------- 012345------------ 2
Janvier------------- 543210------------ 1
Janvier------------- 012345------------ 3
Janvier------------- 543210------------ 2
Fevrier------------- 012345------------ 1

qu'est ce que je dois faire?
Images attachées
Type de fichier : png Sans titre.png (52,3 Ko, 2 affichages)
touta89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 17h29   #4
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Citation:
qu'est ce que je dois faire?
Hé bien commencer par chercher un petit peu
Et si vous êtes planté, alors posez votre question sur le forum !

Essayez :

Code :
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
DECLARE @t TABLE
(
	NumP int identity
	, mois varchar(10)
	, RibRip char(6)
	, NumPC tinyint
)
 
INSERT	INTO @t (mois, RibRip) VALUES ('Janvier', '012345')
INSERT	INTO @t (mois, RibRip) VALUES ('Janvier', '012345')
INSERT	INTO @t (mois, RibRip) VALUES ('Janvier', '543210')
INSERT	INTO @t (mois, RibRip) VALUES ('Janvier', '012345')
INSERT	INTO @t (mois, RibRip) VALUES ('Janvier', '543210')
INSERT	INTO @t (mois, RibRip) VALUES ('Fevrier', '012345')
 
------------------------------------------------------------------
 
;WITH
	CTE AS
	(
		SELECT	NumP
			, mois
			, RibRip
			, ROW_NUMBER() OVER(PARTITION BY mois, RibRip ORDER BY NumP) AS NumPC
		FROM	@t
	)
UPDATE		T
SET		NumPC = C.NumPC
FROM		@t AS T
INNER JOIN	CTE AS C ON T.NumP = C.NumP
 
SELECT	*
FROM	@t
La variable de type TABLE est une représentation de votre table utilisateur.
L'UPDATE se fait sur la base de la clé primaire

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/06/2011, 01h12   #5
Invité régulier
 
Femme Touta
Étudiant
Inscription : mai 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Femme Touta
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 21
Points : 7
Points : 7
Citation:
Hé bien commencer par chercher un petit peu
Et si vous êtes planté, alors posez votre question sur le forum !

Oui sincèrement j'ai cherché et j'ai lu quelques tutoriels concernant les variables de table et les tables temporaires aussi et c'est la première fois que je les face car j'utilise SQL Server nouvellement avec une application web .net comme un projet fin d'étude et vraiment j'ai pas assez du temps pour plus rechercher bon j'ai exécuté ton script et il me donne la résultat désirée mais j'ai pas trouvé comment je l'enregistre et comment je l'appelle pour incrémenter NumP de la table PieceComptable!

je sais bien que c'est honteux mais sincèrement j'ai besoin de l'aide ..
et merci pour tout
touta89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/06/2011, 06h13   #6
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Il n'y a aucune honte à ne pas savoir

Citation:
ui sincèrement j'ai cherché et j'ai lu quelques tutoriels concernant les variables de table et les tables temporaires
Attention : j'ai utilisé une variable de type TABLE seulement pour l'exemple.

Donc vous devez remplacer la variable de type TABLE dans la requête que je vous ai donné par le nom véritable de la table que vous utilisez.

En aucun cas vous ne devez utiliser ce genre de table dans du code de production, comme je l'ai écrit ici, sauf si vous n'avez aucune autre solution.
Dans ce dernier cas, cela montre généralement une mauvaise conception du modèle de données.

Citation:
j'ai pas trouvé comment je l'enregistre et comment je l'appelle pour incrémenter NumP de la table PieceComptable!
Ce script est one-shot, il mettra à jour la valeur de compteur pour toute la table.
Mais je pense que dans votre cas, vous devriez faire ce calcul après chaque insertion dans la table, en appelant une procédure comme celle-ci :

Code :
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
CREATE PROCEDURE maProcedure
	@_mois varchar(10)
	, @_RibRip char(6)
AS
BEGIN
	SET NOCOUNT ON
 
	IF NOT EXISTS
	(
		SELECT	*
		FROM	dbo.maTable
		WHERE	mois = @_mois
		AND	RibRip = @_RibRip
	)
	BEGIN
		RAISERROR('Il n''existe pas de RibRip %s pour le mois %s', 16, 1, @_RibRip, @_mois)
		RETURN
	END
 
	;WITH
		CTE AS
		(
			SELECT	NumP
				, mois
				, RibRip
				, ROW_NUMBER() OVER(PARTITION BY mois, RibRip ORDER BY NumP) AS NumPC
			FROM	dbo.maTable
			WHERE	RibRip = @_RibRip
			AND	mois = @_mois
		)
	UPDATE		dbo.maTable
	SET		NumPC = C.NumPC
	FROM		dbo.maTable AS T
	INNER JOIN	CTE AS C ON T.NumP = C.NumP
END
Peut-être que vous pouvez même passer en paramètre le NumP pour ne mettre à jour qu'une seule ligne

Ensuite il vous faut appeler cette procédure dans votre code, et là tout dépend du langage que vous utilisez pour implémenter votre application.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/06/2011, 15h07   #7
Invité régulier
 
Femme Touta
Étudiant
Inscription : mai 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Femme Touta
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 21
Points : 7
Points : 7
j'ai pas trouvé le dossier "tables temporaires"
Images attachées
Type de fichier : png 1.png (39,5 Ko, 3 affichages)
touta89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 09h37   #8
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
C'est un nœud qui existe seulement pour la base de données TempDB, qui est une base de données système

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/06/2011, 15h52   #9
Invité régulier
 
Femme Touta
Étudiant
Inscription : mai 2011
Messages : 21
Détails du profil
Informations personnelles :
Nom : Femme Touta
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2011
Messages : 21
Points : 7
Points : 7
Par défaut remerciement

Merci Bien
touta89 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h31.


 
 
 
 
Partenaires

Hébergement Web