OVH Cloud OVH Cloud

formatage de données à l'aide de triggers ?

4 réponses
Avatar
Eric Belhomme
Bonjour,

J'utilise un programme qui doit faire des requetes d'insertion de dates au
format JJMMAAAA dans une colonne de type datetime. SQL Server n'étant pas
capable de transtyper ce formatage de date, j'avais pensé la reformatter à
l'aide d'un trigger comme ceci : 'JJ/MM/AAAA'

voici mon trigger :

CREATE TRIGGER [TRIG_DATE] ON [dbo].[T_REGL]
FOR INSERT
NOT FOR REPLICATION
AS
SET date = SUBSTRING(date,1,2) + '/' + SUBSTRING(date,3,2) + '/' +
SUBSTRING(date,5,4)


Hélas, SQL Server ne se satisfait pas de mon code :

Serveur : Msg 242, Niveau 16, État 3, Ligne 1
La conversion d'un type de données CHAR en type DATETIME a donné une valeur
hors des limites des valeurs de date et d'heure.
L'instruction a été arrêtée.

Après queleques recherches sur le ouaibe (qui m'ont mené sur le site de F.
Brouard) j'appends que la norme SQL 3 spécifie plusieurs modes de
déclencheurs, et notamment le mode BEFORE, mais que, pas de bol pour moi,
Transac SQL ne suit absolument pas les spécifications SQL 3 pour ce qui
concerne les triggers...

Bref, tous les exemples que formatage de données que j'ai pu trouver sont
soit en SQL3, soit en PL/SQL, et je ne sais pas comment faire pour
formatter mes données à la volée lors de l'insertion !

Merci pour votre aide ;)

--
Rico

4 réponses

Avatar
Med Bouchenafa
Le mieux est d'utiliser le format 'AAAAMMJJ' sans séparateur
SQL Server saura toujours interprété correctement ce format de date

--
Bien cordialement
Med Bouchenafa

"Eric Belhomme" <{rico}+no/ a écrit dans le message de
news:
Bonjour,

J'utilise un programme qui doit faire des requetes d'insertion de dates au
format JJMMAAAA dans une colonne de type datetime. SQL Server n'étant pas
capable de transtyper ce formatage de date, j'avais pensé la reformatter à
l'aide d'un trigger comme ceci : 'JJ/MM/AAAA'

voici mon trigger :

CREATE TRIGGER [TRIG_DATE] ON [dbo].[T_REGL]
FOR INSERT
NOT FOR REPLICATION
AS
SET date = SUBSTRING(date,1,2) + '/' + SUBSTRING(date,3,2) + '/' +
SUBSTRING(date,5,4)


Hélas, SQL Server ne se satisfait pas de mon code :

Serveur : Msg 242, Niveau 16, État 3, Ligne 1
La conversion d'un type de données CHAR en type DATETIME a donné une
valeur
hors des limites des valeurs de date et d'heure.
L'instruction a été arrêtée.

Après queleques recherches sur le ouaibe (qui m'ont mené sur le site de F.
Brouard) j'appends que la norme SQL 3 spécifie plusieurs modes de
déclencheurs, et notamment le mode BEFORE, mais que, pas de bol pour moi,
Transac SQL ne suit absolument pas les spécifications SQL 3 pour ce qui
concerne les triggers...

Bref, tous les exemples que formatage de données que j'ai pu trouver sont
soit en SQL3, soit en PL/SQL, et je ne sais pas comment faire pour
formatter mes données à la volée lors de l'insertion !

Merci pour votre aide ;)

--
Rico



Avatar
Steve Kass
Eric,

On ne peut pas insérer la valeur '01022005' dans une colonne de
type [datetime], même s'il y a un déclencheur sur la table.

S'il n'est pas possible de modifier la chaîne avant
de faire l'INSERT, il faut INSERT dans une autre table ou vue
ayant une colonne de type char(8), puis insérer la valeur convertie
dans votre table, possiblement avec un déclencheur INSTEAD OF.

Une possibilité:

create table T_REGL (
clé int primary key,
d datetime
)
go

create table T_REGL_empty (
clé int primary key,
d char(8)
)
go

CREATE TRIGGER [TRIG_DATE] ON [dbo].[T_REGL_empty]
INSTEAD OF INSERT
NOT FOR REPLICATION
AS
INSERT INTO T_REGL
SELECT
clé,
SUBSTRING(i.d,5,4) + SUBSTRING(i.d,1,2)
+ SUBSTRING(i.d,3,2)
FROM inserted as i
go

insert into T_REGL_empty values (1, '01022005')
select * from T_REGL
go


Steve Kass
Drew University

Eric Belhomme wrote:

Bonjour,

J'utilise un programme qui doit faire des requetes d'insertion de dates au
format JJMMAAAA dans une colonne de type datetime. SQL Server n'étant pas
capable de transtyper ce formatage de date, j'avais pensé la reformatter à
l'aide d'un trigger comme ceci : 'JJ/MM/AAAA'

voici mon trigger :

CREATE TRIGGER [TRIG_DATE] ON [dbo].[T_REGL]
FOR INSERT
NOT FOR REPLICATION
AS
SET date = SUBSTRING(date,1,2) + '/' + SUBSTRING(date,3,2) + '/' +
SUBSTRING(date,5,4)


Hélas, SQL Server ne se satisfait pas de mon code :

Serveur : Msg 242, Niveau 16, État 3, Ligne 1
La conversion d'un type de données CHAR en type DATETIME a donné une valeur
hors des limites des valeurs de date et d'heure.
L'instruction a été arrêtée.

Après queleques recherches sur le ouaibe (qui m'ont mené sur le site de F.
Brouard) j'appends que la norme SQL 3 spécifie plusieurs modes de
déclencheurs, et notamment le mode BEFORE, mais que, pas de bol pour moi,
Transac SQL ne suit absolument pas les spécifications SQL 3 pour ce qui
concerne les triggers...

Bref, tous les exemples que formatage de données que j'ai pu trouver sont
soit en SQL3, soit en PL/SQL, et je ne sais pas comment faire pour
formatter mes données à la volée lors de l'insertion !

Merci pour votre aide ;)





Avatar
Eric Belhomme
"Med Bouchenafa" wrote in news:#$acwixTFHA.228
@TK2MSFTNGP12.phx.gbl:

Le mieux est d'utiliser le format 'AAAAMMJJ' sans séparateur
SQL Server saura toujours interprété correctement ce format de date



evidemment, le format de date ISO serait plus approprié...le problème est
que je ne peux pas intervenir sur l'application qui effectue les requetes
d'insertion, ni sur les données en amont...

J'ai contourné le problème en ajoutant une colone de type char (8) à ma
table et en mettant un trigger lors de l'insertion qui convertit le champs
inséré dans la colonne char en datetime.

Mais j'aurais espéré quelque cohose de moins "bricole" :-/

--
Rico
Avatar
Michel PRIORI
A mon sens tu as fait au mieux.

Il serait utile d'imposer que les programmes accèdent aux bases se fassent
via des procédures. La fainéantise salvatrice du programmeur s'y oppose en
général :-((
Pour eux il existe un ensemble de routines qui automatisent le tout :
OLYMARS (sur plateforme .net)

Pour la petite histoire le package est servi par microsoft et a été créé par
un français. OLYMARS étant la contraction de Olympique de Marseille je pense
qu'il est plutôt du sud ;-))



"Eric Belhomme" a écrit :

"Med Bouchenafa" wrote in news:#$acwixTFHA.228
@TK2MSFTNGP12.phx.gbl:

> Le mieux est d'utiliser le format 'AAAAMMJJ' sans séparateur
> SQL Server saura toujours interprété correctement ce format de date
>
evidemment, le format de date ISO serait plus approprié...le problème est
que je ne peux pas intervenir sur l'application qui effectue les requetes
d'insertion, ni sur les données en amont...

J'ai contourné le problème en ajoutant une colone de type char (8) à ma
table et en mettant un trigger lors de l'insertion qui convertit le champs
inséré dans la colonne char en datetime.

Mais j'aurais espéré quelque cohose de moins "bricole" :-/

--
Rico