Je dois (à regret !) intervenir sur une table où la clé est un champ
nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
valeurs du champ sont :
N'1'
N'2'
N'3'
etc.
Je sais, c'est pas malin ! A regret vous disais-je...
Jusqu'à présent l'alimentation de cette table était effectuée par une boucle
et un curseur, suivant l'algo grossier suivant :
Pour chaque ligne à insérer
SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
SET @Max = @Max + 1
INSERT MaTable VALUES (CAST(@Max), ...)
Ligne suivante
Mais maintenant je souhaite alimenter par :
INSERT MaTable (des champs sans ChpClé)
SELECT ... FROM UneAutreTable
Comment alors incrémenter automatiquement le champ clé de MaTable ?
Par trigger ? Par DEFAULT ? Par ...?
Jacques.
Je dois (à regret !) intervenir sur une table où la clé est un champ
nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
valeurs du champ sont :
N'1'
N'2'
N'3'
etc.
Je sais, c'est pas malin ! A regret vous disais-je...
Jusqu'à présent l'alimentation de cette table était effectuée par une boucle
et un curseur, suivant l'algo grossier suivant :
Pour chaque ligne à insérer
SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
SET @Max = @Max + 1
INSERT MaTable VALUES (CAST(@Max), ...)
Ligne suivante
Mais maintenant je souhaite alimenter par :
INSERT MaTable (des champs sans ChpClé)
SELECT ... FROM UneAutreTable
Comment alors incrémenter automatiquement le champ clé de MaTable ?
Par trigger ? Par DEFAULT ? Par ...?
Jacques.
Je dois (à regret !) intervenir sur une table où la clé est un champ
nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
valeurs du champ sont :
N'1'
N'2'
N'3'
etc.
Je sais, c'est pas malin ! A regret vous disais-je...
Jusqu'à présent l'alimentation de cette table était effectuée par une boucle
et un curseur, suivant l'algo grossier suivant :
Pour chaque ligne à insérer
SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
SET @Max = @Max + 1
INSERT MaTable VALUES (CAST(@Max), ...)
Ligne suivante
Mais maintenant je souhaite alimenter par :
INSERT MaTable (des champs sans ChpClé)
SELECT ... FROM UneAutreTable
Comment alors incrémenter automatiquement le champ clé de MaTable ?
Par trigger ? Par DEFAULT ? Par ...?
Jacques.
Je dois (à regret !) intervenir sur une table où la clé est un champ
nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
valeurs du champ sont :
N'1'
N'2'
N'3'
etc.
Je sais, c'est pas malin ! A regret vous disais-je...
Jusqu'à présent l'alimentation de cette table était effectuée par une
et un curseur, suivant l'algo grossier suivant :
Pour chaque ligne à insérer
SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
SET @Max = @Max + 1
INSERT MaTable VALUES (CAST(@Max), ...)
Ligne suivante
Mais maintenant je souhaite alimenter par :
INSERT MaTable (des champs sans ChpClé)
SELECT ... FROM UneAutreTable
Comment alors incrémenter automatiquement le champ clé de MaTable ?
Par trigger ? Par DEFAULT ? Par ...?
Jacques.
Je dois (à regret !) intervenir sur une table où la clé est un champ
nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
valeurs du champ sont :
N'1'
N'2'
N'3'
etc.
Je sais, c'est pas malin ! A regret vous disais-je...
Jusqu'à présent l'alimentation de cette table était effectuée par une
et un curseur, suivant l'algo grossier suivant :
Pour chaque ligne à insérer
SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
SET @Max = @Max + 1
INSERT MaTable VALUES (CAST(@Max), ...)
Ligne suivante
Mais maintenant je souhaite alimenter par :
INSERT MaTable (des champs sans ChpClé)
SELECT ... FROM UneAutreTable
Comment alors incrémenter automatiquement le champ clé de MaTable ?
Par trigger ? Par DEFAULT ? Par ...?
Jacques.
Je dois (à regret !) intervenir sur une table où la clé est un champ
nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
valeurs du champ sont :
N'1'
N'2'
N'3'
etc.
Je sais, c'est pas malin ! A regret vous disais-je...
Jusqu'à présent l'alimentation de cette table était effectuée par une
et un curseur, suivant l'algo grossier suivant :
Pour chaque ligne à insérer
SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
SET @Max = @Max + 1
INSERT MaTable VALUES (CAST(@Max), ...)
Ligne suivante
Mais maintenant je souhaite alimenter par :
INSERT MaTable (des champs sans ChpClé)
SELECT ... FROM UneAutreTable
Comment alors incrémenter automatiquement le champ clé de MaTable ?
Par trigger ? Par DEFAULT ? Par ...?
Jacques.
Salut Jacques,
Pourquoi pas une fonction ?
CREATE FUNCTION newid() RETURNS nvarchar(10)
as
BEGIN
DECLARE @NewMax nvarchar(10)
SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1) FROM
MaTable
RETURN @NewMax
END
avec une contrainte DEFAULT
ALTER TABLE MaTable ADD CONSTRAINT def_ident DEFAULT dbo.newid() FOR
Nicolas.
"VUILLERMET Jacques" a écrit dans le message de
news:
> Je dois (à regret !) intervenir sur une table où la clé est un champ
> nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
> valeurs du champ sont :
> N'1'
> N'2'
> N'3'
> etc.
>
> Je sais, c'est pas malin ! A regret vous disais-je...
>
> Jusqu'à présent l'alimentation de cette table était effectuée par une
boucle
> et un curseur, suivant l'algo grossier suivant :
> Pour chaque ligne à insérer
> SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> SET @Max = @Max + 1
> INSERT MaTable VALUES (CAST(@Max), ...)
> Ligne suivante
>
> Mais maintenant je souhaite alimenter par :
> INSERT MaTable (des champs sans ChpClé)
> SELECT ... FROM UneAutreTable
>
> Comment alors incrémenter automatiquement le champ clé de MaTable ?
> Par trigger ? Par DEFAULT ? Par ...?
>
> Jacques.
>
>
>
Salut Jacques,
Pourquoi pas une fonction ?
CREATE FUNCTION newid() RETURNS nvarchar(10)
as
BEGIN
DECLARE @NewMax nvarchar(10)
SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1) FROM
MaTable
RETURN @NewMax
END
avec une contrainte DEFAULT
ALTER TABLE MaTable ADD CONSTRAINT def_ident DEFAULT dbo.newid() FOR
Nicolas.
"VUILLERMET Jacques" <jvuillermet@no-spam.fr> a écrit dans le message de
news:uPTbaZ5rDHA.3468@TK2MSFTNGP11.phx.gbl...
> Je dois (à regret !) intervenir sur une table où la clé est un champ
> nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
> valeurs du champ sont :
> N'1'
> N'2'
> N'3'
> etc.
>
> Je sais, c'est pas malin ! A regret vous disais-je...
>
> Jusqu'à présent l'alimentation de cette table était effectuée par une
boucle
> et un curseur, suivant l'algo grossier suivant :
> Pour chaque ligne à insérer
> SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> SET @Max = @Max + 1
> INSERT MaTable VALUES (CAST(@Max), ...)
> Ligne suivante
>
> Mais maintenant je souhaite alimenter par :
> INSERT MaTable (des champs sans ChpClé)
> SELECT ... FROM UneAutreTable
>
> Comment alors incrémenter automatiquement le champ clé de MaTable ?
> Par trigger ? Par DEFAULT ? Par ...?
>
> Jacques.
>
>
>
Salut Jacques,
Pourquoi pas une fonction ?
CREATE FUNCTION newid() RETURNS nvarchar(10)
as
BEGIN
DECLARE @NewMax nvarchar(10)
SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1) FROM
MaTable
RETURN @NewMax
END
avec une contrainte DEFAULT
ALTER TABLE MaTable ADD CONSTRAINT def_ident DEFAULT dbo.newid() FOR
Nicolas.
"VUILLERMET Jacques" a écrit dans le message de
news:
> Je dois (à regret !) intervenir sur une table où la clé est un champ
> nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
> valeurs du champ sont :
> N'1'
> N'2'
> N'3'
> etc.
>
> Je sais, c'est pas malin ! A regret vous disais-je...
>
> Jusqu'à présent l'alimentation de cette table était effectuée par une
boucle
> et un curseur, suivant l'algo grossier suivant :
> Pour chaque ligne à insérer
> SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> SET @Max = @Max + 1
> INSERT MaTable VALUES (CAST(@Max), ...)
> Ligne suivante
>
> Mais maintenant je souhaite alimenter par :
> INSERT MaTable (des champs sans ChpClé)
> SELECT ... FROM UneAutreTable
>
> Comment alors incrémenter automatiquement le champ clé de MaTable ?
> Par trigger ? Par DEFAULT ? Par ...?
>
> Jacques.
>
>
>
L'idée est excellente et me séduit par sa simplicité.
*** PREMIERE QUESTION
Dans le cas d'une insertion multilignes par
INSERT MaTable (des champs sans ChpClé)
SELECT ...
FROM UneAutreTable /* renvoie n lignes */
--> Cette requête est 1 seule et unique transaction.
La valeur renvoyée par :
SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
sera-t-elle différente à chaque appel de la fonction durant la transaction
(autant d'appels que de lignes) ?
*** DEUXIEME QUESTION
Cette technique supporte-t-elle l'insertion "simultanée" due à un
environnement multi-utilisateurs ?
Par exemple cette chronologie :
- Demande de création d'une ligne
- Appel de la fonction, ramène X
- Commit de la ligne avec la valeur X comme clé
peut-elle devenir :
Client A - Demande de création d'une ligne
Client B - Demande de création d'une ligne
Client A - Appel de la fonction, ramène X
Client B - Appel de la fonction, également ramène X
Client A - Commit de la ligne avec la valeur X comme clé
Client B - Commit de la ligne avec la valeur X comme clé ... et donc
?
Jacques.
"Nicolas LETULLIER" a écrit dans le
message de news:
> Salut Jacques,
>
> Pourquoi pas une fonction ?
>
> CREATE FUNCTION newid() RETURNS nvarchar(10)
> as
> BEGIN
> DECLARE @NewMax nvarchar(10)
> SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1) FROM
> MaTable
> RETURN @NewMax
> END
>
> avec une contrainte DEFAULT
>
> ALTER TABLE MaTable ADD CONSTRAINT def_ident DEFAULT dbo.newid() FOR
ChpCle
>
>
> Nicolas.
>
>
> "VUILLERMET Jacques" a écrit dans le message de
> news:
> > Je dois (à regret !) intervenir sur une table où la clé est un champ
> > nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
> > valeurs du champ sont :
> > N'1'
> > N'2'
> > N'3'
> > etc.
> >
> > Je sais, c'est pas malin ! A regret vous disais-je...
> >
> > Jusqu'à présent l'alimentation de cette table était effectuée par une
> boucle
> > et un curseur, suivant l'algo grossier suivant :
> > Pour chaque ligne à insérer
> > SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> > SET @Max = @Max + 1
> > INSERT MaTable VALUES (CAST(@Max), ...)
> > Ligne suivante
> >
> > Mais maintenant je souhaite alimenter par :
> > INSERT MaTable (des champs sans ChpClé)
> > SELECT ... FROM UneAutreTable
> >
> > Comment alors incrémenter automatiquement le champ clé de MaTable ?
> > Par trigger ? Par DEFAULT ? Par ...?
> >
> > Jacques.
> >
> >
> >
>
>
L'idée est excellente et me séduit par sa simplicité.
*** PREMIERE QUESTION
Dans le cas d'une insertion multilignes par
INSERT MaTable (des champs sans ChpClé)
SELECT ...
FROM UneAutreTable /* renvoie n lignes */
--> Cette requête est 1 seule et unique transaction.
La valeur renvoyée par :
SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
sera-t-elle différente à chaque appel de la fonction durant la transaction
(autant d'appels que de lignes) ?
*** DEUXIEME QUESTION
Cette technique supporte-t-elle l'insertion "simultanée" due à un
environnement multi-utilisateurs ?
Par exemple cette chronologie :
- Demande de création d'une ligne
- Appel de la fonction, ramène X
- Commit de la ligne avec la valeur X comme clé
peut-elle devenir :
Client A - Demande de création d'une ligne
Client B - Demande de création d'une ligne
Client A - Appel de la fonction, ramène X
Client B - Appel de la fonction, également ramène X
Client A - Commit de la ligne avec la valeur X comme clé
Client B - Commit de la ligne avec la valeur X comme clé ... et donc
?
Jacques.
"Nicolas LETULLIER" <nletullier@provibe.ASUPPRIMER.com> a écrit dans le
message de news: O1doUYBsDHA.2380@TK2MSFTNGP09.phx.gbl...
> Salut Jacques,
>
> Pourquoi pas une fonction ?
>
> CREATE FUNCTION newid() RETURNS nvarchar(10)
> as
> BEGIN
> DECLARE @NewMax nvarchar(10)
> SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1) FROM
> MaTable
> RETURN @NewMax
> END
>
> avec une contrainte DEFAULT
>
> ALTER TABLE MaTable ADD CONSTRAINT def_ident DEFAULT dbo.newid() FOR
ChpCle
>
>
> Nicolas.
>
>
> "VUILLERMET Jacques" <jvuillermet@no-spam.fr> a écrit dans le message de
> news:uPTbaZ5rDHA.3468@TK2MSFTNGP11.phx.gbl...
> > Je dois (à regret !) intervenir sur une table où la clé est un champ
> > nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
> > valeurs du champ sont :
> > N'1'
> > N'2'
> > N'3'
> > etc.
> >
> > Je sais, c'est pas malin ! A regret vous disais-je...
> >
> > Jusqu'à présent l'alimentation de cette table était effectuée par une
> boucle
> > et un curseur, suivant l'algo grossier suivant :
> > Pour chaque ligne à insérer
> > SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> > SET @Max = @Max + 1
> > INSERT MaTable VALUES (CAST(@Max), ...)
> > Ligne suivante
> >
> > Mais maintenant je souhaite alimenter par :
> > INSERT MaTable (des champs sans ChpClé)
> > SELECT ... FROM UneAutreTable
> >
> > Comment alors incrémenter automatiquement le champ clé de MaTable ?
> > Par trigger ? Par DEFAULT ? Par ...?
> >
> > Jacques.
> >
> >
> >
>
>
L'idée est excellente et me séduit par sa simplicité.
*** PREMIERE QUESTION
Dans le cas d'une insertion multilignes par
INSERT MaTable (des champs sans ChpClé)
SELECT ...
FROM UneAutreTable /* renvoie n lignes */
--> Cette requête est 1 seule et unique transaction.
La valeur renvoyée par :
SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
sera-t-elle différente à chaque appel de la fonction durant la transaction
(autant d'appels que de lignes) ?
*** DEUXIEME QUESTION
Cette technique supporte-t-elle l'insertion "simultanée" due à un
environnement multi-utilisateurs ?
Par exemple cette chronologie :
- Demande de création d'une ligne
- Appel de la fonction, ramène X
- Commit de la ligne avec la valeur X comme clé
peut-elle devenir :
Client A - Demande de création d'une ligne
Client B - Demande de création d'une ligne
Client A - Appel de la fonction, ramène X
Client B - Appel de la fonction, également ramène X
Client A - Commit de la ligne avec la valeur X comme clé
Client B - Commit de la ligne avec la valeur X comme clé ... et donc
?
Jacques.
"Nicolas LETULLIER" a écrit dans le
message de news:
> Salut Jacques,
>
> Pourquoi pas une fonction ?
>
> CREATE FUNCTION newid() RETURNS nvarchar(10)
> as
> BEGIN
> DECLARE @NewMax nvarchar(10)
> SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1) FROM
> MaTable
> RETURN @NewMax
> END
>
> avec une contrainte DEFAULT
>
> ALTER TABLE MaTable ADD CONSTRAINT def_ident DEFAULT dbo.newid() FOR
ChpCle
>
>
> Nicolas.
>
>
> "VUILLERMET Jacques" a écrit dans le message de
> news:
> > Je dois (à regret !) intervenir sur une table où la clé est un champ
> > nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
> > valeurs du champ sont :
> > N'1'
> > N'2'
> > N'3'
> > etc.
> >
> > Je sais, c'est pas malin ! A regret vous disais-je...
> >
> > Jusqu'à présent l'alimentation de cette table était effectuée par une
> boucle
> > et un curseur, suivant l'algo grossier suivant :
> > Pour chaque ligne à insérer
> > SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> > SET @Max = @Max + 1
> > INSERT MaTable VALUES (CAST(@Max), ...)
> > Ligne suivante
> >
> > Mais maintenant je souhaite alimenter par :
> > INSERT MaTable (des champs sans ChpClé)
> > SELECT ... FROM UneAutreTable
> >
> > Comment alors incrémenter automatiquement le champ clé de MaTable ?
> > Par trigger ? Par DEFAULT ? Par ...?
> >
> > Jacques.
> >
> >
> >
>
>
Aïe, désolé, je n'avais pas compris que c'étent en insertion multiple,
ce cas, ça ne marche plus du tout. Même pour ta 2ème question, c'est très
dangereux (cf Fred).
Une autre idée peut-être, sans dout criticable :
- Ajouter une colonne INT IDENTITY
- Faire un DBCC CHECKIDENT pour lui affecter ta dernière valeur de ChpCle
- Créer un trigger INSERT qui mettra à jour ton ChpCle à partir du
- Ajouter le ChpCle dans le INSERT MaTable (ChpCle, .. autres champs),
un VALUES quelconque (pour valider la contrainte NOT NULL car j'imagine
ce champ est PK)
ALTER TABLE MaTable ADD CheCleIdentity INT IDENTITY
DBCC CHECKIDENT('MaTable', valeurmaxactuelle)
CREATE TRIGGER TR_MaTable_INSERT ON MaTable FOR INSERT AS
BEGIN
DECLARE @NEWID INT
SET @NEWID = @@IDENTITY
UPDATE MaTable SET ChpCle = CONVERT(NVARCHAR, @NEWID)
WHERE CheCleIdentity = @NEWID
END
Nicolas.
"VUILLERMET Jacques" a écrit dans le message de
news:
>
> L'idée est excellente et me séduit par sa simplicité.
>
> *** PREMIERE QUESTION
> Dans le cas d'une insertion multilignes par
> INSERT MaTable (des champs sans ChpClé)
> SELECT ...
> FROM UneAutreTable /* renvoie n lignes */
> --> Cette requête est 1 seule et unique transaction.
>
> La valeur renvoyée par :
> SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
> sera-t-elle différente à chaque appel de la fonction durant la
> (autant d'appels que de lignes) ?
>
> *** DEUXIEME QUESTION
> Cette technique supporte-t-elle l'insertion "simultanée" due à un
> environnement multi-utilisateurs ?
>
> Par exemple cette chronologie :
> - Demande de création d'une ligne
> - Appel de la fonction, ramène X
> - Commit de la ligne avec la valeur X comme clé
>
> peut-elle devenir :
> Client A - Demande de création d'une ligne
> Client B - Demande de création d'une ligne
> Client A - Appel de la fonction, ramène X
> Client B - Appel de la fonction, également ramène X
> Client A - Commit de la ligne avec la valeur X comme clé
> Client B - Commit de la ligne avec la valeur X comme clé ... et donc
échec.
>
> ?
>
> Jacques.
>
>
> "Nicolas LETULLIER" a écrit dans le
> message de news:
> > Salut Jacques,
> >
> > Pourquoi pas une fonction ?
> >
> > CREATE FUNCTION newid() RETURNS nvarchar(10)
> > as
> > BEGIN
> > DECLARE @NewMax nvarchar(10)
> > SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
> > MaTable
> > RETURN @NewMax
> > END
> >
> > avec une contrainte DEFAULT
> >
> > ALTER TABLE MaTable ADD CONSTRAINT def_ident DEFAULT dbo.newid() FOR
> ChpCle
> >
> >
> > Nicolas.
> >
> >
> > "VUILLERMET Jacques" a écrit dans le message
> > news:
> > > Je dois (à regret !) intervenir sur une table où la clé est un champ
> > > nvarchar(6) qui représente un compteur numérique, c'est-à-dire que
> > > valeurs du champ sont :
> > > N'1'
> > > N'2'
> > > N'3'
> > > etc.
> > >
> > > Je sais, c'est pas malin ! A regret vous disais-je...
> > >
> > > Jusqu'à présent l'alimentation de cette table était effectuée par
> > boucle
> > > et un curseur, suivant l'algo grossier suivant :
> > > Pour chaque ligne à insérer
> > > SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> > > SET @Max = @Max + 1
> > > INSERT MaTable VALUES (CAST(@Max), ...)
> > > Ligne suivante
> > >
> > > Mais maintenant je souhaite alimenter par :
> > > INSERT MaTable (des champs sans ChpClé)
> > > SELECT ... FROM UneAutreTable
> > >
> > > Comment alors incrémenter automatiquement le champ clé de MaTable ?
> > > Par trigger ? Par DEFAULT ? Par ...?
> > >
> > > Jacques.
> > >
> > >
> > >
> >
> >
>
>
Aïe, désolé, je n'avais pas compris que c'étent en insertion multiple,
ce cas, ça ne marche plus du tout. Même pour ta 2ème question, c'est très
dangereux (cf Fred).
Une autre idée peut-être, sans dout criticable :
- Ajouter une colonne INT IDENTITY
- Faire un DBCC CHECKIDENT pour lui affecter ta dernière valeur de ChpCle
- Créer un trigger INSERT qui mettra à jour ton ChpCle à partir du
- Ajouter le ChpCle dans le INSERT MaTable (ChpCle, .. autres champs),
un VALUES quelconque (pour valider la contrainte NOT NULL car j'imagine
ce champ est PK)
ALTER TABLE MaTable ADD CheCleIdentity INT IDENTITY
DBCC CHECKIDENT('MaTable', valeurmaxactuelle)
CREATE TRIGGER TR_MaTable_INSERT ON MaTable FOR INSERT AS
BEGIN
DECLARE @NEWID INT
SET @NEWID = @@IDENTITY
UPDATE MaTable SET ChpCle = CONVERT(NVARCHAR, @NEWID)
WHERE CheCleIdentity = @NEWID
END
Nicolas.
"VUILLERMET Jacques" <jvuillermet@no-spam.fr> a écrit dans le message de
news:ulEwq9BsDHA.3436@tk2msftngp13.phx.gbl...
>
> L'idée est excellente et me séduit par sa simplicité.
>
> *** PREMIERE QUESTION
> Dans le cas d'une insertion multilignes par
> INSERT MaTable (des champs sans ChpClé)
> SELECT ...
> FROM UneAutreTable /* renvoie n lignes */
> --> Cette requête est 1 seule et unique transaction.
>
> La valeur renvoyée par :
> SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
> sera-t-elle différente à chaque appel de la fonction durant la
> (autant d'appels que de lignes) ?
>
> *** DEUXIEME QUESTION
> Cette technique supporte-t-elle l'insertion "simultanée" due à un
> environnement multi-utilisateurs ?
>
> Par exemple cette chronologie :
> - Demande de création d'une ligne
> - Appel de la fonction, ramène X
> - Commit de la ligne avec la valeur X comme clé
>
> peut-elle devenir :
> Client A - Demande de création d'une ligne
> Client B - Demande de création d'une ligne
> Client A - Appel de la fonction, ramène X
> Client B - Appel de la fonction, également ramène X
> Client A - Commit de la ligne avec la valeur X comme clé
> Client B - Commit de la ligne avec la valeur X comme clé ... et donc
échec.
>
> ?
>
> Jacques.
>
>
> "Nicolas LETULLIER" <nletullier@provibe.ASUPPRIMER.com> a écrit dans le
> message de news: O1doUYBsDHA.2380@TK2MSFTNGP09.phx.gbl...
> > Salut Jacques,
> >
> > Pourquoi pas une fonction ?
> >
> > CREATE FUNCTION newid() RETURNS nvarchar(10)
> > as
> > BEGIN
> > DECLARE @NewMax nvarchar(10)
> > SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
> > MaTable
> > RETURN @NewMax
> > END
> >
> > avec une contrainte DEFAULT
> >
> > ALTER TABLE MaTable ADD CONSTRAINT def_ident DEFAULT dbo.newid() FOR
> ChpCle
> >
> >
> > Nicolas.
> >
> >
> > "VUILLERMET Jacques" <jvuillermet@no-spam.fr> a écrit dans le message
> > news:uPTbaZ5rDHA.3468@TK2MSFTNGP11.phx.gbl...
> > > Je dois (à regret !) intervenir sur une table où la clé est un champ
> > > nvarchar(6) qui représente un compteur numérique, c'est-à-dire que
> > > valeurs du champ sont :
> > > N'1'
> > > N'2'
> > > N'3'
> > > etc.
> > >
> > > Je sais, c'est pas malin ! A regret vous disais-je...
> > >
> > > Jusqu'à présent l'alimentation de cette table était effectuée par
> > boucle
> > > et un curseur, suivant l'algo grossier suivant :
> > > Pour chaque ligne à insérer
> > > SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> > > SET @Max = @Max + 1
> > > INSERT MaTable VALUES (CAST(@Max), ...)
> > > Ligne suivante
> > >
> > > Mais maintenant je souhaite alimenter par :
> > > INSERT MaTable (des champs sans ChpClé)
> > > SELECT ... FROM UneAutreTable
> > >
> > > Comment alors incrémenter automatiquement le champ clé de MaTable ?
> > > Par trigger ? Par DEFAULT ? Par ...?
> > >
> > > Jacques.
> > >
> > >
> > >
> >
> >
>
>
Aïe, désolé, je n'avais pas compris que c'étent en insertion multiple,
ce cas, ça ne marche plus du tout. Même pour ta 2ème question, c'est très
dangereux (cf Fred).
Une autre idée peut-être, sans dout criticable :
- Ajouter une colonne INT IDENTITY
- Faire un DBCC CHECKIDENT pour lui affecter ta dernière valeur de ChpCle
- Créer un trigger INSERT qui mettra à jour ton ChpCle à partir du
- Ajouter le ChpCle dans le INSERT MaTable (ChpCle, .. autres champs),
un VALUES quelconque (pour valider la contrainte NOT NULL car j'imagine
ce champ est PK)
ALTER TABLE MaTable ADD CheCleIdentity INT IDENTITY
DBCC CHECKIDENT('MaTable', valeurmaxactuelle)
CREATE TRIGGER TR_MaTable_INSERT ON MaTable FOR INSERT AS
BEGIN
DECLARE @NEWID INT
SET @NEWID = @@IDENTITY
UPDATE MaTable SET ChpCle = CONVERT(NVARCHAR, @NEWID)
WHERE CheCleIdentity = @NEWID
END
Nicolas.
"VUILLERMET Jacques" a écrit dans le message de
news:
>
> L'idée est excellente et me séduit par sa simplicité.
>
> *** PREMIERE QUESTION
> Dans le cas d'une insertion multilignes par
> INSERT MaTable (des champs sans ChpClé)
> SELECT ...
> FROM UneAutreTable /* renvoie n lignes */
> --> Cette requête est 1 seule et unique transaction.
>
> La valeur renvoyée par :
> SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
> sera-t-elle différente à chaque appel de la fonction durant la
> (autant d'appels que de lignes) ?
>
> *** DEUXIEME QUESTION
> Cette technique supporte-t-elle l'insertion "simultanée" due à un
> environnement multi-utilisateurs ?
>
> Par exemple cette chronologie :
> - Demande de création d'une ligne
> - Appel de la fonction, ramène X
> - Commit de la ligne avec la valeur X comme clé
>
> peut-elle devenir :
> Client A - Demande de création d'une ligne
> Client B - Demande de création d'une ligne
> Client A - Appel de la fonction, ramène X
> Client B - Appel de la fonction, également ramène X
> Client A - Commit de la ligne avec la valeur X comme clé
> Client B - Commit de la ligne avec la valeur X comme clé ... et donc
échec.
>
> ?
>
> Jacques.
>
>
> "Nicolas LETULLIER" a écrit dans le
> message de news:
> > Salut Jacques,
> >
> > Pourquoi pas une fonction ?
> >
> > CREATE FUNCTION newid() RETURNS nvarchar(10)
> > as
> > BEGIN
> > DECLARE @NewMax nvarchar(10)
> > SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
> > MaTable
> > RETURN @NewMax
> > END
> >
> > avec une contrainte DEFAULT
> >
> > ALTER TABLE MaTable ADD CONSTRAINT def_ident DEFAULT dbo.newid() FOR
> ChpCle
> >
> >
> > Nicolas.
> >
> >
> > "VUILLERMET Jacques" a écrit dans le message
> > news:
> > > Je dois (à regret !) intervenir sur une table où la clé est un champ
> > > nvarchar(6) qui représente un compteur numérique, c'est-à-dire que
> > > valeurs du champ sont :
> > > N'1'
> > > N'2'
> > > N'3'
> > > etc.
> > >
> > > Je sais, c'est pas malin ! A regret vous disais-je...
> > >
> > > Jusqu'à présent l'alimentation de cette table était effectuée par
> > boucle
> > > et un curseur, suivant l'algo grossier suivant :
> > > Pour chaque ligne à insérer
> > > SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> > > SET @Max = @Max + 1
> > > INSERT MaTable VALUES (CAST(@Max), ...)
> > > Ligne suivante
> > >
> > > Mais maintenant je souhaite alimenter par :
> > > INSERT MaTable (des champs sans ChpClé)
> > > SELECT ... FROM UneAutreTable
> > >
> > > Comment alors incrémenter automatiquement le champ clé de MaTable ?
> > > Par trigger ? Par DEFAULT ? Par ...?
> > >
> > > Jacques.
> > >
> > >
> > >
> >
> >
>
>
Je dois (à regret !) intervenir sur une table où la clé est un champ
nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
valeurs du champ sont :
N'1'
N'2'
N'3'
etc.
Je sais, c'est pas malin ! A regret vous disais-je...
Jusqu'à présent l'alimentation de cette table était effectuée par une boucle
et un curseur, suivant l'algo grossier suivant :
Pour chaque ligne à insérer
SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
SET @Max = @Max + 1
INSERT MaTable VALUES (CAST(@Max), ...)
Ligne suivante
Mais maintenant je souhaite alimenter par :
INSERT MaTable (des champs sans ChpClé)
SELECT ... FROM UneAutreTable
Comment alors incrémenter automatiquement le champ clé de MaTable ?
Par trigger ? Par DEFAULT ? Par ...?
Jacques.
Je dois (à regret !) intervenir sur une table où la clé est un champ
nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
valeurs du champ sont :
N'1'
N'2'
N'3'
etc.
Je sais, c'est pas malin ! A regret vous disais-je...
Jusqu'à présent l'alimentation de cette table était effectuée par une boucle
et un curseur, suivant l'algo grossier suivant :
Pour chaque ligne à insérer
SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
SET @Max = @Max + 1
INSERT MaTable VALUES (CAST(@Max), ...)
Ligne suivante
Mais maintenant je souhaite alimenter par :
INSERT MaTable (des champs sans ChpClé)
SELECT ... FROM UneAutreTable
Comment alors incrémenter automatiquement le champ clé de MaTable ?
Par trigger ? Par DEFAULT ? Par ...?
Jacques.
Je dois (à regret !) intervenir sur une table où la clé est un champ
nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
valeurs du champ sont :
N'1'
N'2'
N'3'
etc.
Je sais, c'est pas malin ! A regret vous disais-je...
Jusqu'à présent l'alimentation de cette table était effectuée par une boucle
et un curseur, suivant l'algo grossier suivant :
Pour chaque ligne à insérer
SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
SET @Max = @Max + 1
INSERT MaTable VALUES (CAST(@Max), ...)
Ligne suivante
Mais maintenant je souhaite alimenter par :
INSERT MaTable (des champs sans ChpClé)
SELECT ... FROM UneAutreTable
Comment alors incrémenter automatiquement le champ clé de MaTable ?
Par trigger ? Par DEFAULT ? Par ...?
Jacques.
Aïe, désolé, je n'avais pas compris que c'étent en insertion multiple,
ce cas, ça ne marche plus du tout. Même pour ta 2ème question, c'est très
dangereux (cf Fred).
Une autre idée peut-être, sans dout criticable :
- Ajouter une colonne INT IDENTITY
- Faire un DBCC CHECKIDENT pour lui affecter ta dernière valeur de ChpCle
- Créer un trigger INSERT qui mettra à jour ton ChpCle à partir du
- Ajouter le ChpCle dans le INSERT MaTable (ChpCle, .. autres champs),
un VALUES quelconque (pour valider la contrainte NOT NULL car j'imagine
ce champ est PK)
ALTER TABLE MaTable ADD CheCleIdentity INT IDENTITY
DBCC CHECKIDENT('MaTable', valeurmaxactuelle)
CREATE TRIGGER TR_MaTable_INSERT ON MaTable FOR INSERT AS
BEGIN
DECLARE @NEWID INT
SET @NEWID = @@IDENTITY
UPDATE MaTable SET ChpCle = CONVERT(NVARCHAR, @NEWID)
WHERE CheCleIdentity = @NEWID
END
Nicolas.
"VUILLERMET Jacques" a écrit dans le message de
news:
>
> L'idée est excellente et me séduit par sa simplicité.
>
> *** PREMIERE QUESTION
> Dans le cas d'une insertion multilignes par
> INSERT MaTable (des champs sans ChpClé)
> SELECT ...
> FROM UneAutreTable /* renvoie n lignes */
> --> Cette requête est 1 seule et unique transaction.
>
> La valeur renvoyée par :
> SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
> sera-t-elle différente à chaque appel de la fonction durant la
> (autant d'appels que de lignes) ?
>
> *** DEUXIEME QUESTION
> Cette technique supporte-t-elle l'insertion "simultanée" due à un
> environnement multi-utilisateurs ?
>
> Par exemple cette chronologie :
> - Demande de création d'une ligne
> - Appel de la fonction, ramène X
> - Commit de la ligne avec la valeur X comme clé
>
> peut-elle devenir :
> Client A - Demande de création d'une ligne
> Client B - Demande de création d'une ligne
> Client A - Appel de la fonction, ramène X
> Client B - Appel de la fonction, également ramène X
> Client A - Commit de la ligne avec la valeur X comme clé
> Client B - Commit de la ligne avec la valeur X comme clé ... et donc
échec.
>
> ?
>
> Jacques.
>
>
> "Nicolas LETULLIER" a écrit dans le
> message de news:
> > Salut Jacques,
> >
> > Pourquoi pas une fonction ?
> >
> > CREATE FUNCTION newid() RETURNS nvarchar(10)
> > as
> > BEGIN
> > DECLARE @NewMax nvarchar(10)
> > SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
> > MaTable
> > RETURN @NewMax
> > END
> >
> > avec une contrainte DEFAULT
> >
> > ALTER TABLE MaTable ADD CONSTRAINT def_ident DEFAULT dbo.newid() FOR
> ChpCle
> >
> >
> > Nicolas.
> >
> >
> > "VUILLERMET Jacques" a écrit dans le message
> > news:
> > > Je dois (à regret !) intervenir sur une table où la clé est un champ
> > > nvarchar(6) qui représente un compteur numérique, c'est-à-dire que
> > > valeurs du champ sont :
> > > N'1'
> > > N'2'
> > > N'3'
> > > etc.
> > >
> > > Je sais, c'est pas malin ! A regret vous disais-je...
> > >
> > > Jusqu'à présent l'alimentation de cette table était effectuée par
> > boucle
> > > et un curseur, suivant l'algo grossier suivant :
> > > Pour chaque ligne à insérer
> > > SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> > > SET @Max = @Max + 1
> > > INSERT MaTable VALUES (CAST(@Max), ...)
> > > Ligne suivante
> > >
> > > Mais maintenant je souhaite alimenter par :
> > > INSERT MaTable (des champs sans ChpClé)
> > > SELECT ... FROM UneAutreTable
> > >
> > > Comment alors incrémenter automatiquement le champ clé de MaTable ?
> > > Par trigger ? Par DEFAULT ? Par ...?
> > >
> > > Jacques.
> > >
> > >
> > >
> >
> >
>
>
Aïe, désolé, je n'avais pas compris que c'étent en insertion multiple,
ce cas, ça ne marche plus du tout. Même pour ta 2ème question, c'est très
dangereux (cf Fred).
Une autre idée peut-être, sans dout criticable :
- Ajouter une colonne INT IDENTITY
- Faire un DBCC CHECKIDENT pour lui affecter ta dernière valeur de ChpCle
- Créer un trigger INSERT qui mettra à jour ton ChpCle à partir du
- Ajouter le ChpCle dans le INSERT MaTable (ChpCle, .. autres champs),
un VALUES quelconque (pour valider la contrainte NOT NULL car j'imagine
ce champ est PK)
ALTER TABLE MaTable ADD CheCleIdentity INT IDENTITY
DBCC CHECKIDENT('MaTable', valeurmaxactuelle)
CREATE TRIGGER TR_MaTable_INSERT ON MaTable FOR INSERT AS
BEGIN
DECLARE @NEWID INT
SET @NEWID = @@IDENTITY
UPDATE MaTable SET ChpCle = CONVERT(NVARCHAR, @NEWID)
WHERE CheCleIdentity = @NEWID
END
Nicolas.
"VUILLERMET Jacques" <jvuillermet@no-spam.fr> a écrit dans le message de
news:ulEwq9BsDHA.3436@tk2msftngp13.phx.gbl...
>
> L'idée est excellente et me séduit par sa simplicité.
>
> *** PREMIERE QUESTION
> Dans le cas d'une insertion multilignes par
> INSERT MaTable (des champs sans ChpClé)
> SELECT ...
> FROM UneAutreTable /* renvoie n lignes */
> --> Cette requête est 1 seule et unique transaction.
>
> La valeur renvoyée par :
> SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
> sera-t-elle différente à chaque appel de la fonction durant la
> (autant d'appels que de lignes) ?
>
> *** DEUXIEME QUESTION
> Cette technique supporte-t-elle l'insertion "simultanée" due à un
> environnement multi-utilisateurs ?
>
> Par exemple cette chronologie :
> - Demande de création d'une ligne
> - Appel de la fonction, ramène X
> - Commit de la ligne avec la valeur X comme clé
>
> peut-elle devenir :
> Client A - Demande de création d'une ligne
> Client B - Demande de création d'une ligne
> Client A - Appel de la fonction, ramène X
> Client B - Appel de la fonction, également ramène X
> Client A - Commit de la ligne avec la valeur X comme clé
> Client B - Commit de la ligne avec la valeur X comme clé ... et donc
échec.
>
> ?
>
> Jacques.
>
>
> "Nicolas LETULLIER" <nletullier@provibe.ASUPPRIMER.com> a écrit dans le
> message de news: O1doUYBsDHA.2380@TK2MSFTNGP09.phx.gbl...
> > Salut Jacques,
> >
> > Pourquoi pas une fonction ?
> >
> > CREATE FUNCTION newid() RETURNS nvarchar(10)
> > as
> > BEGIN
> > DECLARE @NewMax nvarchar(10)
> > SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
> > MaTable
> > RETURN @NewMax
> > END
> >
> > avec une contrainte DEFAULT
> >
> > ALTER TABLE MaTable ADD CONSTRAINT def_ident DEFAULT dbo.newid() FOR
> ChpCle
> >
> >
> > Nicolas.
> >
> >
> > "VUILLERMET Jacques" <jvuillermet@no-spam.fr> a écrit dans le message
> > news:uPTbaZ5rDHA.3468@TK2MSFTNGP11.phx.gbl...
> > > Je dois (à regret !) intervenir sur une table où la clé est un champ
> > > nvarchar(6) qui représente un compteur numérique, c'est-à-dire que
> > > valeurs du champ sont :
> > > N'1'
> > > N'2'
> > > N'3'
> > > etc.
> > >
> > > Je sais, c'est pas malin ! A regret vous disais-je...
> > >
> > > Jusqu'à présent l'alimentation de cette table était effectuée par
> > boucle
> > > et un curseur, suivant l'algo grossier suivant :
> > > Pour chaque ligne à insérer
> > > SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> > > SET @Max = @Max + 1
> > > INSERT MaTable VALUES (CAST(@Max), ...)
> > > Ligne suivante
> > >
> > > Mais maintenant je souhaite alimenter par :
> > > INSERT MaTable (des champs sans ChpClé)
> > > SELECT ... FROM UneAutreTable
> > >
> > > Comment alors incrémenter automatiquement le champ clé de MaTable ?
> > > Par trigger ? Par DEFAULT ? Par ...?
> > >
> > > Jacques.
> > >
> > >
> > >
> >
> >
>
>
Aïe, désolé, je n'avais pas compris que c'étent en insertion multiple,
ce cas, ça ne marche plus du tout. Même pour ta 2ème question, c'est très
dangereux (cf Fred).
Une autre idée peut-être, sans dout criticable :
- Ajouter une colonne INT IDENTITY
- Faire un DBCC CHECKIDENT pour lui affecter ta dernière valeur de ChpCle
- Créer un trigger INSERT qui mettra à jour ton ChpCle à partir du
- Ajouter le ChpCle dans le INSERT MaTable (ChpCle, .. autres champs),
un VALUES quelconque (pour valider la contrainte NOT NULL car j'imagine
ce champ est PK)
ALTER TABLE MaTable ADD CheCleIdentity INT IDENTITY
DBCC CHECKIDENT('MaTable', valeurmaxactuelle)
CREATE TRIGGER TR_MaTable_INSERT ON MaTable FOR INSERT AS
BEGIN
DECLARE @NEWID INT
SET @NEWID = @@IDENTITY
UPDATE MaTable SET ChpCle = CONVERT(NVARCHAR, @NEWID)
WHERE CheCleIdentity = @NEWID
END
Nicolas.
"VUILLERMET Jacques" a écrit dans le message de
news:
>
> L'idée est excellente et me séduit par sa simplicité.
>
> *** PREMIERE QUESTION
> Dans le cas d'une insertion multilignes par
> INSERT MaTable (des champs sans ChpClé)
> SELECT ...
> FROM UneAutreTable /* renvoie n lignes */
> --> Cette requête est 1 seule et unique transaction.
>
> La valeur renvoyée par :
> SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
> sera-t-elle différente à chaque appel de la fonction durant la
> (autant d'appels que de lignes) ?
>
> *** DEUXIEME QUESTION
> Cette technique supporte-t-elle l'insertion "simultanée" due à un
> environnement multi-utilisateurs ?
>
> Par exemple cette chronologie :
> - Demande de création d'une ligne
> - Appel de la fonction, ramène X
> - Commit de la ligne avec la valeur X comme clé
>
> peut-elle devenir :
> Client A - Demande de création d'une ligne
> Client B - Demande de création d'une ligne
> Client A - Appel de la fonction, ramène X
> Client B - Appel de la fonction, également ramène X
> Client A - Commit de la ligne avec la valeur X comme clé
> Client B - Commit de la ligne avec la valeur X comme clé ... et donc
échec.
>
> ?
>
> Jacques.
>
>
> "Nicolas LETULLIER" a écrit dans le
> message de news:
> > Salut Jacques,
> >
> > Pourquoi pas une fonction ?
> >
> > CREATE FUNCTION newid() RETURNS nvarchar(10)
> > as
> > BEGIN
> > DECLARE @NewMax nvarchar(10)
> > SELECT @NewMax = CONVERT(nvarchar, MAX(CONVERT(int, ChpCle)) + 1)
> > MaTable
> > RETURN @NewMax
> > END
> >
> > avec une contrainte DEFAULT
> >
> > ALTER TABLE MaTable ADD CONSTRAINT def_ident DEFAULT dbo.newid() FOR
> ChpCle
> >
> >
> > Nicolas.
> >
> >
> > "VUILLERMET Jacques" a écrit dans le message
> > news:
> > > Je dois (à regret !) intervenir sur une table où la clé est un champ
> > > nvarchar(6) qui représente un compteur numérique, c'est-à-dire que
> > > valeurs du champ sont :
> > > N'1'
> > > N'2'
> > > N'3'
> > > etc.
> > >
> > > Je sais, c'est pas malin ! A regret vous disais-je...
> > >
> > > Jusqu'à présent l'alimentation de cette table était effectuée par
> > boucle
> > > et un curseur, suivant l'algo grossier suivant :
> > > Pour chaque ligne à insérer
> > > SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> > > SET @Max = @Max + 1
> > > INSERT MaTable VALUES (CAST(@Max), ...)
> > > Ligne suivante
> > >
> > > Mais maintenant je souhaite alimenter par :
> > > INSERT MaTable (des champs sans ChpClé)
> > > SELECT ... FROM UneAutreTable
> > >
> > > Comment alors incrémenter automatiquement le champ clé de MaTable ?
> > > Par trigger ? Par DEFAULT ? Par ...?
> > >
> > > Jacques.
> > >
> > >
> > >
> >
> >
>
>
si tu es en version 2000, tu peux faire un trigger 'instead of' dans
fais un curseur pour l'insertion multiligne
ex :
-- TEST création d'une autonum 'pourrite'
USE NORTHWIND
GO
if exists (select * from dbo.sysobjects where id > object_id(N'[dbo].[TG_INS_brtst1]') and OBJECTPROPERTY(id, N'IsTrigger') 1)
drop trigger [dbo].[TG_INS_brtst1]
GO
if exists (select * from dbo.sysobjects where id object_id(N'[dbo].[brtst1]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[brtst1]
GO
CREATE TABLE [dbo].[brtst1] (
[a] [char] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[b] [char] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[brtst1] WITH NOCHECK ADD
CONSTRAINT [PK_brtst1] PRIMARY KEY CLUSTERED
(
[a]
) ON [PRIMARY]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE TRIGGER [TG_INS_brtst1] ON [dbo].[brtst1]
INSTEAD OF INSERT
AS
DECLARE @maxid int
DECLARE @b char(10)
SET @maxid = COALESCE((SELECT MAX(CONVERT(INT,a)) FROM
DECLARE CUR_brtst1 CURSOR FOR
SELECT b FROM inserted
OPEN CUR_brtst1
FETCH NEXT FROM CUR_brtst1
INTO @b
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT [dbo].[brtst1]
(a,b)
values (CONVERT(char(10),@maxid),@b )
FETCH NEXT FROM CUR_brtst1
INTO @b
SET @maxid = @maxid + 1
END
CLOSE CUR_brtst1
DEALLOCATE CUR_brtst1
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
-- insertion des premières lignes
INSERT INTO [Northwind].[dbo].[brtst1]([a], [b])
VALUES('x', 'aaaa')
INSERT INTO [Northwind].[dbo].[brtst1]([a], [b])
VALUES( '1', 'bbbb')
GO
SELECT * FROM [dbo].[brtst1]
GO
INSERT INTO [Northwind].[dbo].[brtst1]([a], [b])
SELECT a, b FROM [dbo].[brtst1]
GO
SELECT * FROM [dbo].[brtst1]
GO
INSERT INTO [Northwind].[dbo].[brtst1]([a], [b])
SELECT a, b FROM [dbo].[brtst1]
GO
SELECT * FROM [dbo].[brtst1]
GO
******************
br
"VUILLERMET Jacques" wrote in message
news:
> Je dois (à regret !) intervenir sur une table où la clé est un champ
> nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
> valeurs du champ sont :
> N'1'
> N'2'
> N'3'
> etc.
>
> Je sais, c'est pas malin ! A regret vous disais-je...
>
> Jusqu'à présent l'alimentation de cette table était effectuée par une
> et un curseur, suivant l'algo grossier suivant :
> Pour chaque ligne à insérer
> SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> SET @Max = @Max + 1
> INSERT MaTable VALUES (CAST(@Max), ...)
> Ligne suivante
>
> Mais maintenant je souhaite alimenter par :
> INSERT MaTable (des champs sans ChpClé)
> SELECT ... FROM UneAutreTable
>
> Comment alors incrémenter automatiquement le champ clé de MaTable ?
> Par trigger ? Par DEFAULT ? Par ...?
>
> Jacques.
>
>
>
si tu es en version 2000, tu peux faire un trigger 'instead of' dans
fais un curseur pour l'insertion multiligne
ex :
-- TEST création d'une autonum 'pourrite'
USE NORTHWIND
GO
if exists (select * from dbo.sysobjects where id > object_id(N'[dbo].[TG_INS_brtst1]') and OBJECTPROPERTY(id, N'IsTrigger') 1)
drop trigger [dbo].[TG_INS_brtst1]
GO
if exists (select * from dbo.sysobjects where id object_id(N'[dbo].[brtst1]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[brtst1]
GO
CREATE TABLE [dbo].[brtst1] (
[a] [char] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[b] [char] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[brtst1] WITH NOCHECK ADD
CONSTRAINT [PK_brtst1] PRIMARY KEY CLUSTERED
(
[a]
) ON [PRIMARY]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE TRIGGER [TG_INS_brtst1] ON [dbo].[brtst1]
INSTEAD OF INSERT
AS
DECLARE @maxid int
DECLARE @b char(10)
SET @maxid = COALESCE((SELECT MAX(CONVERT(INT,a)) FROM
DECLARE CUR_brtst1 CURSOR FOR
SELECT b FROM inserted
OPEN CUR_brtst1
FETCH NEXT FROM CUR_brtst1
INTO @b
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT [dbo].[brtst1]
(a,b)
values (CONVERT(char(10),@maxid),@b )
FETCH NEXT FROM CUR_brtst1
INTO @b
SET @maxid = @maxid + 1
END
CLOSE CUR_brtst1
DEALLOCATE CUR_brtst1
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
-- insertion des premières lignes
INSERT INTO [Northwind].[dbo].[brtst1]([a], [b])
VALUES('x', 'aaaa')
INSERT INTO [Northwind].[dbo].[brtst1]([a], [b])
VALUES( '1', 'bbbb')
GO
SELECT * FROM [dbo].[brtst1]
GO
INSERT INTO [Northwind].[dbo].[brtst1]([a], [b])
SELECT a, b FROM [dbo].[brtst1]
GO
SELECT * FROM [dbo].[brtst1]
GO
INSERT INTO [Northwind].[dbo].[brtst1]([a], [b])
SELECT a, b FROM [dbo].[brtst1]
GO
SELECT * FROM [dbo].[brtst1]
GO
******************
br
"VUILLERMET Jacques" <jvuillermet@no-spam.fr> wrote in message
news:uPTbaZ5rDHA.3468@TK2MSFTNGP11.phx.gbl...
> Je dois (à regret !) intervenir sur une table où la clé est un champ
> nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
> valeurs du champ sont :
> N'1'
> N'2'
> N'3'
> etc.
>
> Je sais, c'est pas malin ! A regret vous disais-je...
>
> Jusqu'à présent l'alimentation de cette table était effectuée par une
> et un curseur, suivant l'algo grossier suivant :
> Pour chaque ligne à insérer
> SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> SET @Max = @Max + 1
> INSERT MaTable VALUES (CAST(@Max), ...)
> Ligne suivante
>
> Mais maintenant je souhaite alimenter par :
> INSERT MaTable (des champs sans ChpClé)
> SELECT ... FROM UneAutreTable
>
> Comment alors incrémenter automatiquement le champ clé de MaTable ?
> Par trigger ? Par DEFAULT ? Par ...?
>
> Jacques.
>
>
>
si tu es en version 2000, tu peux faire un trigger 'instead of' dans
fais un curseur pour l'insertion multiligne
ex :
-- TEST création d'une autonum 'pourrite'
USE NORTHWIND
GO
if exists (select * from dbo.sysobjects where id > object_id(N'[dbo].[TG_INS_brtst1]') and OBJECTPROPERTY(id, N'IsTrigger') 1)
drop trigger [dbo].[TG_INS_brtst1]
GO
if exists (select * from dbo.sysobjects where id object_id(N'[dbo].[brtst1]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[brtst1]
GO
CREATE TABLE [dbo].[brtst1] (
[a] [char] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[b] [char] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[brtst1] WITH NOCHECK ADD
CONSTRAINT [PK_brtst1] PRIMARY KEY CLUSTERED
(
[a]
) ON [PRIMARY]
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
CREATE TRIGGER [TG_INS_brtst1] ON [dbo].[brtst1]
INSTEAD OF INSERT
AS
DECLARE @maxid int
DECLARE @b char(10)
SET @maxid = COALESCE((SELECT MAX(CONVERT(INT,a)) FROM
DECLARE CUR_brtst1 CURSOR FOR
SELECT b FROM inserted
OPEN CUR_brtst1
FETCH NEXT FROM CUR_brtst1
INTO @b
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT [dbo].[brtst1]
(a,b)
values (CONVERT(char(10),@maxid),@b )
FETCH NEXT FROM CUR_brtst1
INTO @b
SET @maxid = @maxid + 1
END
CLOSE CUR_brtst1
DEALLOCATE CUR_brtst1
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
-- insertion des premières lignes
INSERT INTO [Northwind].[dbo].[brtst1]([a], [b])
VALUES('x', 'aaaa')
INSERT INTO [Northwind].[dbo].[brtst1]([a], [b])
VALUES( '1', 'bbbb')
GO
SELECT * FROM [dbo].[brtst1]
GO
INSERT INTO [Northwind].[dbo].[brtst1]([a], [b])
SELECT a, b FROM [dbo].[brtst1]
GO
SELECT * FROM [dbo].[brtst1]
GO
INSERT INTO [Northwind].[dbo].[brtst1]([a], [b])
SELECT a, b FROM [dbo].[brtst1]
GO
SELECT * FROM [dbo].[brtst1]
GO
******************
br
"VUILLERMET Jacques" wrote in message
news:
> Je dois (à regret !) intervenir sur une table où la clé est un champ
> nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
> valeurs du champ sont :
> N'1'
> N'2'
> N'3'
> etc.
>
> Je sais, c'est pas malin ! A regret vous disais-je...
>
> Jusqu'à présent l'alimentation de cette table était effectuée par une
> et un curseur, suivant l'algo grossier suivant :
> Pour chaque ligne à insérer
> SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
> SET @Max = @Max + 1
> INSERT MaTable VALUES (CAST(@Max), ...)
> Ligne suivante
>
> Mais maintenant je souhaite alimenter par :
> INSERT MaTable (des champs sans ChpClé)
> SELECT ... FROM UneAutreTable
>
> Comment alors incrémenter automatiquement le champ clé de MaTable ?
> Par trigger ? Par DEFAULT ? Par ...?
>
> Jacques.
>
>
>
Je dois (à regret !) intervenir sur une table où la clé est un champ
nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
valeurs du champ sont :
N'1'
N'2'
N'3'
etc.
Je sais, c'est pas malin ! A regret vous disais-je...
Jusqu'à présent l'alimentation de cette table était effectuée par une
et un curseur, suivant l'algo grossier suivant :
Pour chaque ligne à insérer
SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
SET @Max = @Max + 1
INSERT MaTable VALUES (CAST(@Max), ...)
Ligne suivante
Mais maintenant je souhaite alimenter par :
INSERT MaTable (des champs sans ChpClé)
SELECT ... FROM UneAutreTable
Comment alors incrémenter automatiquement le champ clé de MaTable ?
Par trigger ? Par DEFAULT ? Par ...?
Jacques.
Je dois (à regret !) intervenir sur une table où la clé est un champ
nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
valeurs du champ sont :
N'1'
N'2'
N'3'
etc.
Je sais, c'est pas malin ! A regret vous disais-je...
Jusqu'à présent l'alimentation de cette table était effectuée par une
et un curseur, suivant l'algo grossier suivant :
Pour chaque ligne à insérer
SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
SET @Max = @Max + 1
INSERT MaTable VALUES (CAST(@Max), ...)
Ligne suivante
Mais maintenant je souhaite alimenter par :
INSERT MaTable (des champs sans ChpClé)
SELECT ... FROM UneAutreTable
Comment alors incrémenter automatiquement le champ clé de MaTable ?
Par trigger ? Par DEFAULT ? Par ...?
Jacques.
Je dois (à regret !) intervenir sur une table où la clé est un champ
nvarchar(6) qui représente un compteur numérique, c'est-à-dire que les
valeurs du champ sont :
N'1'
N'2'
N'3'
etc.
Je sais, c'est pas malin ! A regret vous disais-je...
Jusqu'à présent l'alimentation de cette table était effectuée par une
et un curseur, suivant l'algo grossier suivant :
Pour chaque ligne à insérer
SELECT @Max = CAST(MAX(ChpClé)) FROM MaTable
SET @Max = @Max + 1
INSERT MaTable VALUES (CAST(@Max), ...)
Ligne suivante
Mais maintenant je souhaite alimenter par :
INSERT MaTable (des champs sans ChpClé)
SELECT ... FROM UneAutreTable
Comment alors incrémenter automatiquement le champ clé de MaTable ?
Par trigger ? Par DEFAULT ? Par ...?
Jacques.