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 14/09/2011, 21h17   #1
Futur Membre du Club
 
Inscription : septembre 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 39
Points : 18
Points : 18
Par défaut Insertion en paquets ?

Bonsoir à tous ,

Je viens vers vous car je souhaite faire de l'insertion en paquet dans un sql server 2008.
Ci-après ma requete type d'insert :
Code :
1
2
3
 
INSERT INTO aeosdb..token (class,badgenumber,objectid)
VALUES (1,1,(SELECT (MAX(objectid)+1) FROM token))
Le problème c'est qu'au niveau du badgenumber je voudrais mettre une plage.
Code :
1
2
3
 
INSERT INTO aeosdb..token (class,badgenumber,objectid)
VALUES (1,de .. à .. ,(SELECT (MAX(objectid)+1) FROM token))
Merci par avance pour vos reponses.

Bonne soirée
Devilstuff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 01h49   #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,

Je sais que cela n'a rien à voir avec votre demande, mais par pitié arrêtez de volontairement omettre le nom du schéma dans lequel se trouve la table que vous manipulez : c'est très souvent dbo.
Je ne crois pas que ces trois lettres soient un surcoût considérable au temps de développement

Vous auriez pu écrire votre INSERT comme suit :

Code :
1
2
3
4
5
6
7
8
9
10
INSERT	INTO  aeosdb.dbo.token
(
	class
	, badgenumber
	, objectid
)
SELECT	1
	, 1
	, MAX(objectid) + 1
FROM token
Comme dans votre cas vous voulez faire une insertion de plage, il faudra passer à :

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
SET NOCOUNT ON
GO
 
DECLARE @max_object_id int
	, @LIMIT int = 50000
	, @i int = 1
 
SELECT	@max_object_id = MAX(objectid) + 1
FROM	dbo.token
 
WHILE @i <= @LIMIT
BEGIN
	INSERT	INTO  aeosdb.dbo.token
	(
		class
		, badgenumber
		, objectid
	)
	SELECT	1
		, @i
		, @max_object_id
 
	SET @i = @i + 1
END
Cela dit si vous aviez une table de nombres dans votre base de données, l'expression de la requête est très simple, et sera surtout beaucoup plus rapide :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
INSERT	INTO  aeosdb.dbo.token
(
	class
	, badgenumber
	, objectid
)
SELECT		1
		, N.nombre
		, (MAX(T.objectid) + 1)
FROM		dbo.token AS T
CROSS JOIN	dbo.nombres AS N
WHERE		N.nombre BETWEEN 1 AND 50000
@++
__________________
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 15/09/2011, 14h16   #3
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
Comme le contexte n'est pas vraiment précis on peut aussi supposer que votre table ne soit pas créé avant votre insertion en "paquets".

On pourrait avoir ce genre de choses :

Code :
1
2
3
4
5
6
7
8
9
10
 
DECLARE @LIMIT INT = 10000;
 
SELECT TOP (@LIMIT) 
 1 AS class,
 IDENTITY(INT, 1, 1) AS badge_number,
 (SELECT MAX(objectid) FROM dbo.token) AS objectid
INTO aeosdb.dbo.token
FROM master.dbo.spt_values AS V
CROSS JOIN master.dbo.spt_values AS V2
++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/09/2011, 20h33   #4
Futur Membre du Club
 
Inscription : septembre 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 39
Points : 18
Points : 18
Bonsoir ,

Effectivement le dbo n'est pas systématique dans mes codes

Merci cela fonctionne avec cette requête ( j'avais un soucis avec l'objectid de la requete d'origine)

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
 
SET NOCOUNT ON
GO
 
DECLARE @max_object_id int
	, @LIMIT int = 50000
	, @i int = 7
 
--SELECT	@max_object_id = (MAX(objectid)+1)
--FROM	dbo.token
 
WHILE @i <= @LIMIT
BEGIN
	INSERT	INTO  aeosdb.dbo.token
	(
		class
		, Type
		, badgenumber
		, objectid
	)
	SELECT	1
		, 1
		, @i
		, (SELECT (MAX(objectid)+1) FROM token)
 
	SET @i=@i+1
END
Par contre si ma plage de badge est stocké dans une table dbo.plagedebadge :

Code :
1
2
3
4
5
6
7
8
 
id  Debut  fin     Type
1    650    789     1
2    852    950     2
3   1000   1290    2
4   1499   1789    1
5   2405   2693    2
6   7488   9434    2
Comment je peux faire pour que la requete cherche automatiquement les valeurs dans cette table avec le Type correspondant ?

Soit si l'id = 1
alors
@LIMIT = 789
@i = 650
Type = 1

Soit si l'id = 2
alors
@LIMIT = 950
@i = 852
Type = 2

ainsi de suite jusqu'a la fin.

Merci encore pour toutes vos réponses !!!

Bonne soirée
Devilstuff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 03h07   #5
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
@Mikedavem : ben alors, le "dbo" de la table spt_values, il est en vacances avec toi ?

@Devilstuff : si vous avez des plages de numéro de badges, encore une fois avec une jointure sur la table de nombre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
INSERT	INTO  aeosdb.dbo.token
(
	class
	, badgenumber
	, objectid
)
SELECT		1
		, N.nombre
		, (MAX(T.objectid) + 1)
FROM		dbo.token AS T
CROSS JOIN	dbo.plagedebadge AS PDB
INNER JOIN	dbo.nombres AS N
			ON N.nombre BETWEEN PDB.Debut AND PDB.Fin			
WHERE		N.nombre BETWEEN 1 AND 50000
@++
__________________
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 16/09/2011, 06h49   #6
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
@Elsuket : C'est pour que tu puisses faire la leçon à tout le monde oh grand expert sqlserver !! .. tu as vu j'ai modifié mon code et j'ai mis dbo ...
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 09h02   #7
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
Ça aurait été marrant un modérateur qui corrige Ze Responsable

@++
__________________
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 16/09/2011, 09h04   #8
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
C'est pas prévu dans la mission dans modérateurs !!!

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 22h51   #9
Futur Membre du Club
 
Inscription : septembre 2009
Messages : 39
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 39
Points : 18
Points : 18
Coucou ,

Avec toutes vos aides j'ai reussi a compiler une requete qui fonctionne

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
43
44
45
46
47
48
49
50
51
52
53
54
SET NOCOUNT ON
GO
 
DECLARE
	@LIMIT1 int = 6 -- N° de la dernière ligne
	, @i1 int = 1 -- N° de la premiere ligne
	, @LIMIT2 int -- Fin de la Plage de badge
	, @i2 int -- Debut de la Plage de badge
	, @Type int -- Type de badge avec objectid
 
SELECT @LIMIT2 = Fin FROM aeosdb.dbo.plagedebagde WHERE Id = @i1
SELECT @i2 = Debut FROM aeosdb.dbo.plagedebagde WHERE Id = @i1
SELECT @Type = Type FROM aeosdb.dbo.plagedebagde WHERE Id = @i1
 
 
WHILE @i2 <= @LIMIT2 AND @i1 <= @LIMIT1
BEGIN
	INSERT	INTO  aeosdb.dbo.token
	(
		class
		, identifiertype_objectid
		, badgenumber
		, objectid
	)
 
	SELECT	1
		, @Type
		, @i2
		, (SELECT (MAX(objectid)+1) FROM aeosdb.dbo.token)
 
	SET @i2=@i2+1
 
WHILE @i2 = @LIMIT2 AND @i1 <= @LIMIT1
BEGIN
	INSERT	INTO  aeosdb.dbo.token
	(
		class
		, identifiertype_objectid
		, badgenumber
		, objectid
	)
 
	SELECT	1
		, @Type
		, @i2
		, (SELECT (MAX(objectid)+1) FROM aeosdb.dbo.token)
 
	SET @i1=@i1+1
	SELECT @LIMIT2 = Fin FROM aeosdb.dbo.plagedebagde WHERE Id = @i1
	SELECT @i2 = Debut FROM aeosdb.dbo.plagedebagde WHERE Id = @i1
	SELECT @Type = Type FROM aeosdb.dbo.plagedebagde WHERE Id = @i1
 
END
END
Bon je suppose que ca peut s'ameliorer mais bon ca marche
Je peux mettre RESOLU !!!
Merci encore

Bonne soirée à vous
Devilstuff 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 01h57.


 
 
 
 
Partenaires

Hébergement Web