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

Rêquete d'insertion SQL Server 2005

17 réponses
Avatar
EmanuelL
Bonjour à Tous,

J'ai une table Budget dont "Budget_Id" est un PK non
auto-incrémentiel:'(, j'aimerai insérer les budgets 2010 qui sont les
mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500

Etant donnée que "Budget_Id" n'est pas auto-incrémentiel, je dois
récupérer le dernier enregistrement (MAX(Budget_Id), par exemple) et
pouvoir l'incrémenter de 1 :-Z avant de l'insérer dans la table...

Une idée (qui ne fonctionne pas!):
INSERT INTO Budget (Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT Budget_Id, Client_Id, 'Budget 2010', 2010, Montant
FROM Budget WHERE Budget_Id IN
(SELECT Budget_Id FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL)

Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant
l'insertion d'une nouvelle ligne?

PS : Je ne peux pas modifier le structure de cette table. >:|

Merci d'avance. ;-)

--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org

10 réponses

1 2
Avatar
EmanuelL
J'ai trouvé une solution provisoire en bidouillant, je ne sais pas ce
que ça vaut.

1. Je crée une table temporaire avec la même structure que la table
Budget à l'exception de la colonne Budget_Id que je mets en identity.

2. Je récupère le no du dernier enregistremant:
DECLARE @RecNr int
SELECT @RecNr = MAX(Budget_Id) + 1 FROM Budget

3. Je modifie le seed de la colonne Budget_Id:
DBCC CHECKIDENT ( '#tmpBudget', RESEED, @RecNr )

4. J'insère les budgets 2010 dans la table Budget
INSERT INTO #tmpBudget (Budget_Id, Client_Id, Designation, Annee,
Montant)
SELECT Budget_Id, Client_Id, 'Budget 2010', 2010, Montant
FROM Budget WHERE Budget_Id IN
(SELECT Budget_Id FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL)

5. Pour finir je transfère les données de la table temporaire vers la
table Budget.

Précaution à prendre: interdire les utilisateurs d'utiliser la table
Budget durant l'opération. Pour éviter de conflits au niveau de no
d'enregistrement de la table Budget.

Vos conseilles sont les bienvenus. ;-)
A+

EmanuelL vient de nous annoncer :
Bonjour à Tous,

J'ai une table Budget dont "Budget_Id" est un PK non auto-incrémentiel:'(,
j'aimerai insérer les budgets 2010 qui sont les mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500

Etant donnée que "Budget_Id" n'est pas auto-incrémentiel, je dois récupérer
le dernier enregistrement (MAX(Budget_Id), par exemple) et pouvoir
l'incrémenter de 1 :-Z avant de l'insérer dans la table...

Une idée (qui ne fonctionne pas!):
INSERT INTO Budget (Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT Budget_Id, Client_Id, 'Budget 2010', 2010, Montant
FROM Budget WHERE Budget_Id IN
(SELECT Budget_Id FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL)

Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant l'insertion
d'une nouvelle ligne?

PS : Je ne peux pas modifier le structure de cette table. >:|

Merci d'avance. ;-)



--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Avatar
Patrice
Bonjour,

J'ai une table Budget dont "Budget_Id" est un PK non auto-incrémentiel:'(,
j'aimerai insérer les budgets 2010 qui sont les mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500


[coupé]
Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant
l'insertion d'une nouvelle ligne?



Eventuellement :

INSERT INTO
SELECT Budget_Id+@Décalage etc...

@Décalage est la différence entre le prochain n° à insérer et le plus bas
que l'on sélectionnera dans les données à insérer. Cela donne par exemple
(1804+1-1798)=7

ce qui donnera bien
Budget_id+705 si Budget_id98
Budget_id+706 si Budget_id99
etc...

--
Patrice
Avatar
EmanuelL
Merci Patrice de ta proposition,

Je coince à la création de @Décalage, je n'arrive pas à trouver comment
le crée.

A+ ;-)

Il se trouve que Patrice a formulé :
Bonjour,

J'ai une table Budget dont "Budget_Id" est un PK non auto-incrémentiel:'(,
j'aimerai insérer les budgets 2010 qui sont les mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500


[coupé]
Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant
l'insertion d'une nouvelle ligne?



Eventuellement :

INSERT INTO
SELECT Budget_Id+@Décalage etc...

@Décalage est la différence entre le prochain n° à insérer et le plus bas que
l'on sélectionnera dans les données à insérer. Cela donne par exemple
(1804+1-1798)=7

ce qui donnera bien
Budget_id+705 si Budget_id98
Budget_id+706 si Budget_id99
etc...



--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Avatar
Michel__D
Bonjour,

La question n'est pas de le créer mais de le définir (valeur fixe), c'est
le delta entre la valeur mini et maxi de [Budget_Id] de la table [Budget] + 1

Exemple avec les données situées plus bas :

SELECT Budget_Id+7, ...

La valeur de @Décalage correspond à 1804-1798+1=7

EmanuelL a écrit :
Merci Patrice de ta proposition,

Je coince à la création de @Décalage, je n'arrive pas à trouver comment
le crée.

A+ ;-)

Il se trouve que Patrice a formulé :
Bonjour,

J'ai une table Budget dont "Budget_Id" est un PK non
auto-incrémentiel:'(, j'aimerai insérer les budgets 2010 qui sont les
mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500


[coupé]
Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant
l'insertion d'une nouvelle ligne?



Eventuellement :

INSERT INTO
SELECT Budget_Id+@Décalage etc...

@Décalage est la différence entre le prochain n° à insérer et le plus
bas que l'on sélectionnera dans les données à insérer. Cela donne par
exemple (1804+1-1798)=7

ce qui donnera bien
Budget_id+705 si Budget_id98
Budget_id+706 si Budget_id99
etc...





Avatar
Med Bouchenafa
Tu calcules la prochaine valeur par un MAX et tu passes par une table
temporaire

SELECT Budget_Id=IDENTITY(INT, 1805, 1), Client_Id=Client_Id,
Designation='Budget 2010', Annee 10, Montant=Montant
INTO #Budget
FROM Budget

INSERT INTO Budget SELECT * FROM #Budget

Bien cordialement
Med Bouchenafa

"EmanuelL" wrote in message
news:
Bonjour à Tous,

J'ai une table Budget dont "Budget_Id" est un PK non auto-incrémentiel:'(,
j'aimerai insérer les budgets 2010 qui sont les mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500

Etant donnée que "Budget_Id" n'est pas auto-incrémentiel, je dois
récupérer le dernier enregistrement (MAX(Budget_Id), par exemple) et
pouvoir l'incrémenter de 1 :-Z avant de l'insérer dans la table...

Une idée (qui ne fonctionne pas!):
INSERT INTO Budget (Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT Budget_Id, Client_Id, 'Budget 2010', 2010, Montant
FROM Budget WHERE Budget_Id IN
(SELECT Budget_Id FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL)

Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant
l'insertion d'une nouvelle ligne?

PS : Je ne peux pas modifier le structure de cette table. >:|

Merci d'avance. ;-)

--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org




Avatar
EmanuelL
Michel__D,

ça j'ai compris;

DECLARE @Max int, @Min int, @Decalage int
select @Max = max(probudget_nr) from probudget
select @Min = min(probudget_nr) from probudget
SET @Decalage = (@Max - @Min + 1) + @Min

Le problème qui reste comment utiliser @Decalage dans
INSERT INTO... SELECT(@Decalage, ...) et que ce calcul se fait
automatiquemen! :-Z

A+ ;-)

Michel__D avait écrit le 25.11.2009 :
Bonjour,

La question n'est pas de le créer mais de le définir (valeur fixe), c'est
le delta entre la valeur mini et maxi de [Budget_Id] de la table [Budget] +
1

Exemple avec les données situées plus bas :

SELECT Budget_Id+7, ...

La valeur de @Décalage correspond à 1804-1798+1=7

EmanuelL a écrit :
Merci Patrice de ta proposition,

Je coince à la création de @Décalage, je n'arrive pas à trouver comment le
crée.

A+ ;-)

Il se trouve que Patrice a formulé :
Bonjour,

J'ai une table Budget dont "Budget_Id" est un PK non
auto-incrémentiel:'(, j'aimerai insérer les budgets 2010 qui sont les
mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500


[coupé]
Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant
l'insertion d'une nouvelle ligne?



Eventuellement :

INSERT INTO
SELECT Budget_Id+@Décalage etc...

@Décalage est la différence entre le prochain n° à insérer et le plus bas
que l'on sélectionnera dans les données à insérer. Cela donne par exemple
(1804+1-1798)=7

ce qui donnera bien
Budget_id+705 si Budget_id98
Budget_id+706 si Budget_id99
etc...








--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Avatar
EmanuelL
Merci Med,

J'ai adapté ma rêquete par rapport à ta solution.

Mais, je voulais que le 1805 soit dans une variable pour automatiser le
traitement: "SELECT Budget_Id=IDENTITY(INT, @Decalage, 1)". :/

A+ ;-)

Med Bouchenafa avait écrit le 25.11.2009 :
Tu calcules la prochaine valeur par un MAX et tu passes par une table
temporaire

SELECT Budget_Id=IDENTITY(INT, 1805, 1), Client_Id=Client_Id,
Designation='Budget 2010', Annee 10, Montant=Montant
INTO #Budget
FROM Budget

INSERT INTO Budget SELECT * FROM #Budget

Bien cordialement
Med Bouchenafa

"EmanuelL" wrote in message
news:
Bonjour à Tous,

J'ai une table Budget dont "Budget_Id" est un PK non auto-incrémentiel:'(,
j'aimerai insérer les budgets 2010 qui sont les mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500

Etant donnée que "Budget_Id" n'est pas auto-incrémentiel, je dois récupérer
le dernier enregistrement (MAX(Budget_Id), par exemple) et pouvoir
l'incrémenter de 1 :-Z avant de l'insérer dans la table...

Une idée (qui ne fonctionne pas!):
INSERT INTO Budget (Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT Budget_Id, Client_Id, 'Budget 2010', 2010, Montant
FROM Budget WHERE Budget_Id IN
(SELECT Budget_Id FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL)

Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant
l'insertion d'une nouvelle ligne?

PS : Je ne peux pas modifier le structure de cette table. >:|

Merci d'avance. ;-)

--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org







--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Avatar
Patrice
Donc cela donnerait :

DECLARE @Max int, @Min int, @Decalage int
select @Max = max(probudget_nr) from probudget -- La dernière valeur
utilisée
select @Min = min(probudget_nr) from probudget where Annee 09 AND Montant
IS NOT NULL -- La plus petite valeur utilisée dans les valeurs à insérer
SET @Decalage = (@Max - @Min + 1) + @Min -- Donc cela donne de combien il
faut augmenter la plus petite valeur pour obtenir la prochaine valeur
utilisable

INSERT INTO Budget (Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT Budget_Id+@Decalage,Client_Id, 'Budget 2010', 2010, Montant
FROM Budget WHERE Budget_Id IN
(SELECT Budget_Id FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL)


Donc on copie les données en ajoutant cette valeur de décalage à chaque
valeur Budget_id existante ce qui donne bien de nouvelles valeurs non encore
utilisées...

--
Patrice
Avatar
EmanuelL
Génial, merci encore Patrice.

SET @Decalage = (@Max - @Min + 1) + @Min


Petite correction : SET @Decalage =(@Max - @Min + 1), car si Max = 1804
et Min = 9 alors 1804 - 9 + 1 = 1796. Si Budget_Id = 9 alors 1796 + 9 =
1805 tout en rajoutant ORDER BY Budget_Id dans SELECT.

Seul bémol; s'il y a de trous dus au suppression de lignes, ils seront
réportés aussi :-Z.

Toutefois, je suis content des solutions proposées. Merci à tous.

A+ ;-)

Patrice a formulé la demande :
Donc cela donnerait :

DECLARE @Max int, @Min int, @Decalage int
select @Max = max(probudget_nr) from probudget -- La dernière valeur utilisée
select @Min = min(probudget_nr) from probudget where Annee 09 AND Montant
IS NOT NULL -- La plus petite valeur utilisée dans les valeurs à insérer
SET @Decalage = (@Max - @Min + 1) + @Min -- Donc cela donne de combien il
faut augmenter la plus petite valeur pour obtenir la prochaine valeur
utilisable

INSERT INTO Budget (Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT Budget_Id+@Decalage,Client_Id, 'Budget 2010', 2010, Montant
FROM Budget WHERE Budget_Id IN
(SELECT Budget_Id FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL)


Donc on copie les données en ajoutant cette valeur de décalage à chaque
valeur Budget_id existante ce qui donne bien de nouvelles valeurs non encore
utilisées...



--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org
Avatar
Med Bouchenafa
DECLARE @Decalage INT
SELECT @Decalage= MAX(Budget_Id ) FROM Budget

SELECT Budget_Id=IDENTITY(INT, 1, 1), Client_Id=Client_Id,
Designation='Budget 2010', Annee 10, Montant=Montant
INTO #Budget
FROM Budget

INSERT INTO Budget
SELECT Budget_Id = @Decalage + Budget_Id, Client_Id, Designation, Annee,
Montant FROM #Budget


Bien cordialement
Med Bouchenafa


"EmanuelL" wrote in message
news:
Merci Med,

J'ai adapté ma rêquete par rapport à ta solution.

Mais, je voulais que le 1805 soit dans une variable pour automatiser le
traitement: "SELECT Budget_Id=IDENTITY(INT, @Decalage, 1)". :/

A+ ;-)

Med Bouchenafa avait écrit le 25.11.2009 :
Tu calcules la prochaine valeur par un MAX et tu passes par une table
temporaire

SELECT Budget_Id=IDENTITY(INT, 1805, 1), Client_Id=Client_Id,
Designation='Budget 2010', Annee 10, Montant=Montant
INTO #Budget
FROM Budget

INSERT INTO Budget SELECT * FROM #Budget

Bien cordialement
Med Bouchenafa

"EmanuelL" wrote in message
news:
Bonjour à Tous,

J'ai une table Budget dont "Budget_Id" est un PK non
auto-incrémentiel:'(, j'aimerai insérer les budgets 2010 qui sont les
mêmes que de 2009.

Table Budget:
Budget_Id Client_Id Designation Annee Montant
1798 3100259 Budget 2009 6500
1799 2300200 Budget 2009 300
1800 2300201 Budget 2009 2100
1801 3100261 Budget 2009 5000
1802 4100656 Budget 2009 1500
1803 2300202 Budget 2009 3000
1804 4100655 Budget 2009 500

Etant donnée que "Budget_Id" n'est pas auto-incrémentiel, je dois
récupérer le dernier enregistrement (MAX(Budget_Id), par exemple) et
pouvoir l'incrémenter de 1 :-Z avant de l'insérer dans la table...

Une idée (qui ne fonctionne pas!):
INSERT INTO Budget (Budget_Id, Client_Id, Designation, Annee, Montant)
SELECT Budget_Id, Client_Id, 'Budget 2010', 2010, Montant
FROM Budget WHERE Budget_Id IN
(SELECT Budget_Id FROM Budget
WHERE Annee = 2009 AND Montant IS NOT NULL)

Question:
Comment faire pour incrémenter automatiquement "Budget_Id" avant
l'insertion d'une nouvelle ligne?

PS : Je ne peux pas modifier le structure de cette table. >:|

Merci d'avance. ;-)

--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org







--

*!* -----------------------------------
EmanuelL
Membre d'AtoutFox
www.atoutfox.org




1 2