Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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 08/06/2011, 17h54   #1
Futur Membre du Club
 
Homme Stéphane Bouvet
Chef de projet MOA
Inscription : mai 2011
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Stéphane Bouvet
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Biens de consommation

Informations forums :
Inscription : mai 2011
Messages : 40
Points : 15
Points : 15
Par défaut Affecter un numéro de ticket

Bonsoir,

Je voudrais affecter à une liste lambda un numéro automatique qui commencerait à X, incrémenté par pas de 1.

Exemple : 300 lignes auxquelles je dois affecter un numéro (peu importe l'ordre) de 1300 à 1600. Aujourd'hui la procédure qui le fait passe par un curseur (dont je voudrais me débarrasser), mais je suis persuadé que les instances compétentes ici bas me proposeraient bien un petit SELECT qui ajouterait automatiquement 1 au précédent (je suis sous SQL SERVER 2000 donc le ROW_NUMBER est proscrit...)

Merci d'avance !
darKStein est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 18h26   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

En effet, un row_number aurait bien fait l'affaire...


sans row_number, ni CTE, je ne vois pas de solution sans table temporaire :

1/ créez un table temporaire, contenant le résultat de votre requête, et une colonne supplémentaire "Rang" initialement à NULL

2/ affectez le rang :

Code SQL :
1
2
3
4
5
6
7
 
DECLARE @N INT
SET @N = 1300
 
UPDATE #Temp
    SET Rang = @N,
    @N = @N + 1

3/ et zou !
Code SQL :
1
2
3
 
SELECT MesColonnes
FROM #Temp

Il y a peut être mieux (si quelqu'un est plus inspiré que moi...) mais je pense que ce sera toujours mieux qu'un curseur...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 19h18   #3
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,

Il suffit en fait de rajouter un CASE, s'il y a plus de lignes que la plage à mettre à jour :

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
36
37
38
39
40
41
42
SET NOCOUNT ON
 
-- Creation de la table
CREATE TABLE dbo.toto
(
	toto varchar(16)
	, ticket int
)
 
-- Peuplement de la table
DECLARE @i int
SET @i = 1
 
WHILE @i <= 400
BEGIN
	INSERT	INTO dbo.toto (toto)
	SELECT	'toto_' + CAST(@i AS varchar(10))
 
	SET @i = @i + 1
END
GO
 
 
DECLARE @start int
	, @range int
 
SELECT	@start = 1300
	, @range = 300
 
----------------------------------
DECLARE @LIMIT int
SET	@LIMIT = @start + @range
 
UPDATE	dbo.toto
SET	ticket = @start
	, @start = CASE
			WHEN @start <= @LIMIT - 1 THEN @start + 1
			ELSE NULL -- ou ticket si l'on ne souhaite pas que la valeur soit changée
		END
 
SELECT	*
FROM	dbo.toto
@++
__________________
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 09/06/2011, 10h17   #4
Futur Membre du Club
 
Homme Stéphane Bouvet
Chef de projet MOA
Inscription : mai 2011
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Stéphane Bouvet
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Chef de projet MOA
Secteur : Biens de consommation

Informations forums :
Inscription : mai 2011
Messages : 40
Points : 15
Points : 15
Merci pour ces réponses !
Ce qui est curieux dans l'exemple de aieeeuuuuu, c'est que si l'on commence à 1000, le premier a pour ticket le numéro 1001 alors que l'update précise @n = @n + 1 après l'affectation de @n au champ ticket ?
darKStein est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 13h44   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
en fait, ce n'est pas la façon d’écrire la requête, mais le moteur qui détermine l'ordre d'affectation...
Et le moteur à décidé, comme le montre le plan d’exécution, d’incrémenter @N avant de mettre à jour la colonne...

Bah, initialisons @N = 1299
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h02.


 
 
 
 
Partenaires

Hébergement Web