OVH Cloud OVH Cloud

Incrémenter du texte...

9 réponses
Avatar
VUILLERMET 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.

9 réponses

Avatar
Fred BROUARD - SQLpro
defaut pas possible.
trigger difficile sauf à passer une fausse clef au départ, donc pas
d'insert multiligne.

A lire sur le sujet :

http://sqlpro.developpez.com/ClefsAuto/SQL_ClefsAuto.html



VUILLERMET Jacques a écrit :
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.





Avatar
Nicolas LETULLIER
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.





Avatar
VUILLERMET 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 é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) 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.
>
>
>




Avatar
Nicolas LETULLIER
Aïe, désolé, je n'avais pas compris que c'étent en insertion multiple, dans
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 IDENTITY
- Ajouter le ChpCle dans le INSERT MaTable (ChpCle, .. autres champs), avec
un VALUES quelconque (pour valider la contrainte NOT NULL car j'imagine que
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 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


é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) 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.
> >
> >
> >
>
>




Avatar
Nicolas LETULLIER
Je vas finalement m'autocritiquer, c'est ça que de vouloir aller trop vite.
Je n'ai bien entendu dit que des c...ies, mais le temps que je m'en rende
compte, j'étais déjà dans l'ascenseur...

- Bien sûr, ne pas utiliser de @@IDENTITY dans le trigger
- La contrainte PRIMARY KEY sur le champ ChpCle ne passera en INSERT SELECT.

Il faudrait donc que le champ ChpCle ne soit plus PK, accepte éventuellement
les NULL (pour simplifier le INSERT SELECT), et que le champ IDENTITY
devienne la PK.

Le trigger, quant à lui, deviendrait :
CREATE TRIGGER TR_MaTable_INSERT ON MaTable FOR INSERT AS
BEGIN
UPDATE maTable
SET IDENT = CONVERT(VARCHAR, T1.cle2ident)
FROM maTable T1 INNER JOIN inserted T2 ON (T1.ChpCleIdentity T2.ChpCleIdentity )
END

Mea culpa.

Espérant t'être quand même un peu utile...

Nicolas.



"Nicolas LETULLIER" a écrit dans le
message de news:
Aïe, désolé, je n'avais pas compris que c'étent en insertion multiple,


dans
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


IDENTITY
- Ajouter le ChpCle dans le INSERT MaTable (ChpCle, .. autres champs),


avec
un VALUES quelconque (pour valider la contrainte NOT NULL car j'imagine


que
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


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
é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)


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.
> > >
> > >
> > >
> >
> >
>
>




Avatar
bruno reiter [MVP]
si tu es en version 2000, tu peux faire un trigger 'instead of' dans lequel tu
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 [dbo].[brtst1] ),0) + 1


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 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.





Avatar
VUILLERMET Jacques
L'idée est purement et simplement super applicable à mon cas !

(je ne vais pas l'implémenter dans un trigger mais dans une proc stock)

Tu m'as débloqué les neurones ! (...bloquées par un rhube !)

Merci Nicolas !

Jacques.

"Nicolas LETULLIER" a écrit dans le
message de news:
Aïe, désolé, je n'avais pas compris que c'étent en insertion multiple,


dans
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


IDENTITY
- Ajouter le ChpCle dans le INSERT MaTable (ChpCle, .. autres champs),


avec
un VALUES quelconque (pour valider la contrainte NOT NULL car j'imagine


que
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


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
é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)


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.
> > >
> > >
> > >
> >
> >
>
>




Avatar
VUILLERMET Jacques
Ton idée tient la route, malgrè l'utilisation d'un curseur.

Je retiens cette idée si celle de Nicolas s'avère non implémentable dans mon
cas.

Merci !

Jacques.

"bruno reiter [MVP]" a écrit dans le message
de news:
si tu es en version 2000, tu peux faire un trigger 'instead of' dans


lequel tu
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


[dbo].[brtst1] ),0) + 1


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


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.
>
>
>




Avatar
VUILLERMET Jacques
Merci à tous pour votre participation à ce post.

Je n'aurai pas cru mobiliser une telle énergie sur cette question !

Fred, Nicolas, Bruno : merci encore.

Jacques.

"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.