Juste pour vous montrer à titre pédagogique comment transformer votre trigger de type Row (notion qui n'existe pas sous SQL Server !)
en Trigger de type Statement.
Pour cela je reprend presque la même structure de la table T_COMMANDE_CMD et le même jeux d'essai fournis par aieeeuuuuu
Résultat :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 CREATE SEQUENCE SEQ_CMD2 START WITH 1; GO CREATE TABLE T_COMMANDE_CMD2( CMD_ID INT NOT NULL PRIMARY KEY IDENTITY , CMD_REFERENCE VARCHAR(11) NULL , AutresColonnes VARCHAR(50) ); GO CREATE TRIGGER TR_T_COMMANDE_CMD2 ON T_COMMANDE_CMD2 FOR INSERT AS BEGIN UPDATE T_COMMANDE_CMD2 SET CMD_REFERENCE = 'IC/'+FORMAT(CURRENT_TIMESTAMP, 'yy') + RIGHT(REPLICATE('0',4)+CAST( (NEXT VALUE FOR SEQ_CMD2) as varchar(4)),4) FROM T_COMMANDE_CMD2 INNER JOIN inserted ON Inserted.CMD_ID = T_COMMANDE_CMD2.CMD_ID END GO INSERT INTO T_COMMANDE_CMD2 (AutresColonnes) VALUES('donnees1'); INSERT INTO T_COMMANDE_CMD2 (AutresColonnes) VALUES('donnees2'); INSERT INTO T_COMMANDE_CMD2 (AutresColonnes) VALUES('donnees3'); -- 1er janvier ALTER SEQUENCE SEQ_CMD RESTART WITH 1; INSERT INTO T_COMMANDE_CMD2(AutresColonnes) VALUES ('donnees4') ,('donnees5') ,('donnees6') ;
- Remarquez au passage l'utilisation de la fonction Format(..., yy). Cette fonction, très pratique, a été rajoutée depuis SQL Server 2012Code:
1
2
3
4 CMD_ID CMD_REFERENCE AutresColonnes 1 IC/140001 donnees1 2 IC/140002 donnees2 3 IC/140003 donnees3
- Remarquez également la jointure interne entre la table des commandes (T_COMMANDE_CMD2) et pseudo table inserted, ce qui permet d'appliquer l'Update à toutes les lignes insérées (pseudo table Inserted).
- Retenez que la pseudo table Inserted contient 0 (zéro), une ou plusieurs lignes. (et non pas une seule ligne !)
PS : C'est à titre purement pédagogique concernant l'utilisation des Triggers. Je ne valide pas la solution retenue.
A+