Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/11/2011, 15h34   #1
Candidat au titre de Membre du Club
 
Homme
Consultant en Business Intelligence
Inscription : mars 2011
Messages : 26
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : mars 2011
Messages : 26
Points : 11
Points : 11
Par défaut Un format de Date compliqué ! DATETIME, TIMESTAMP, DATE ?

Bonjour et merci d'avance pour votre aide,

Avant tout, Je précise que je simplifie le problème pour une meilleur compréhension :

Alors, je me trouve dans une impasse. J'ai une base de données SQL Server 2008 dans laquelle se trouve une table :

Code :
1
2
3
4
5
CREATE TABLE TableDate (
	ID int NOT NULL,
	DATE1 date NULL,
	DATE2 date NULL,
	DATE3 date NULL)
Pour entrer des données dans cette table, j'ai comme point d'entré un fichier CSV que je ne peux pas toucher. A titre d'exemple je vous pose la première ligne de ce fichier :

Code :
123;01/09/11 00:00:00,000000000;15/09/11 00:00:00,000000000;20/09/11 00:00:00,000000000
Pour insérer les lignes de ce fichier dans ma table j'utilise le code suivant :

Code :
1
2
3
4
5
6
7
8
9
10
BULK INSERT TableDate
FROM 'c:\Scripts SQL\export.csv'
WITH
(
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
FIRSTROW = 2,
DATAFILETYPE = 'char'
)
GO
Enfin l'erreur retournée :

Code :
1
2
Msg 4864, Level 16, State 1, Line 2
Bulk LOAD DATA conversion error (type mismatch OR invalid character FOR the specified codepage) FOR row 1, COLUMN 2 (DATE1).
J'ai bien compris que le problème venait de la date. Le type date n'accepte pas la complexité de '15/09/11 00:00:00,000000000'. J'ai donc essayé les autres types :
- datetime : marche pas
- timestamp : marche pour DATE1 et le problème se décale à DATE2. Si je mets tout en timestamp, une erreur me dit que je n'ai droit qu'à un seul timestamp.

Je suis donc bloqué. Je pense que la solution serai de pouvoir, à la création de la base, préciser le format de la date qui va être passé lors de l'INSERT. un format de type jj/mm/aa hh:mm:ss,ms

Quelqu'un peut-il m'aider ?

Merci
Amarox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 17h12   #2
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 773
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 773
Points : 1 837
Points : 1 837
Dans mes souvenirs le BULK fonctionne également avec un fichier .fmt qui permet de définir le format d'entrée du fichier.. a voir de ce côté peut-être.
Sinon, SSIS c'est bien aussi pour faire de l'insert de masse.
__________________
Alexandre Chemla - Consultant MS BI chez Masao
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 17h25   #3
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 139
Points : 2 470
Points : 2 470
Envoyer un message via Yahoo à zinzineti
Citation:
Envoyé par Amarox Voir le message
Bonjour et merci d'avance pour votre aide,

Avant tout, Je précise que je simplifie le problème pour une meilleur compréhension :

Alors, je me trouve dans une impasse. J'ai une base de données SQL Server 2008 dans laquelle se trouve une table :

Code :
1
2
3
4
5
CREATE TABLE _TableDate (
	ID int NOT NULL,
	DATE1 date NULL,
	DATE2 date NULL,
	DATE3 date NULL)
Code :
123;01/09/11 00:00:00,000000000;15/09/11 00:00:00,000000000;20/09/11 00:00:00,000000000
Pour insérer les lignes de ce fichier dans ma table j'utilise le code suivant :

Code :
1
2
3
4
5
6
7
8
9
10
BULK INSERT TableDate
FROM 'c:\Scripts SQL\export.csv'
WITH
(
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
FIRSTROW = 2,
DATAFILETYPE = 'char'
)
GO
D'abord tu as _TableDate comme table et tu fais une insertion dans TableDate

Mais le vrai problème c'est que tes colonnes sont de type DATE et veux insérer une valeur du genre 01/09/11 00:00:00,000000000
Lis ceci

au fait la virgule qu'il y a là représente quoi ? une date c'est au format AAAA-MM-JJ

Si tu es dans l'urgence alors créer une table temporaire en remplaçant les types DATE par varchar (50) et charge les données du fichier dans cette table temporaire et après tu te débrouille pour charger la table TableDate avec quelque du genre et des CAST, SUBSTRING , ...
Code :
1
2
INSERT INTO TableDate (ID,DATE1,DATE2,DATE3)
SELECT ..... FROM TableTemporaire
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 18h20   #4
Candidat au titre de Membre du Club
 
Homme
Consultant en Business Intelligence
Inscription : mars 2011
Messages : 26
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : mars 2011
Messages : 26
Points : 11
Points : 11
Merci,

Je dois finir ce point demain soir, ordre du chef ! Je suis chez moi la, j'ai bien lu vos posts, je reviens vers vous des demain.

Bonne soiré, merci encore
Amarox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 07h34   #5
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Le ne fonctionne pas avec BULKINSERT?

Jamais essayé...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 11h14   #6
Candidat au titre de Membre du Club
 
Homme
Consultant en Business Intelligence
Inscription : mars 2011
Messages : 26
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : mars 2011
Messages : 26
Points : 11
Points : 11
Citation:
Envoyé par zinzineti Voir le message
D'abord tu as _TableDate comme table et tu fais une insertion dans TableDate
Merci j'ai corrigé,

Citation:
Mais le vrai problème c'est que tes colonnes sont de type DATE et veux insérer une valeur du genre 01/09/11 00:00:00,000000000
au fait la virgule qu'il y a là représente quoi ? une date c'est au format AAAA-MM-JJ
Le fichier CSV est un extract d'une base oracle. Je pense que les zéro après la virgule sont les millisecondes.

Sinon, je poursuit les tests sur fichier .fmt et SET DATEFORMAT='ymd'

merci à vous
Amarox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2011, 16h38   #7
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Essayez :

Code :
1
2
3
4
5
6
CREATE TABLE tmp_TableDate (
	ID int NOT NULL,
	DATE1 NVARCHAR(60) NULL,
	DATE2 NVARCHAR(60) NULL,
	DATE3 NVARCHAR(60) NULL);
GO
Code :
1
2
3
4
5
6
7
8
9
10
BULK INSERT tmp_TableDate
FROM 'c:\Scripts SQL\export.csv'
WITH
(
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
FIRSTROW = 2,
DATAFILETYPE = 'char'
)
GO
Code :
1
2
3
4
5
6
SET DATEFORMAT DMY;
 
INSERT INTO TableDate (ID, DATE1, DATE2, DATE3)
SELECT ID, REPLACE(DATE1, ',', '.'), REPLACE(DATE2, ',', '.'), REPLACE(DATE3, ',', '.'), 
FROM    tmp_TableDate
GO
Code :
DROP TABLE tmp_TableDate
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 14h54   #8
Candidat au titre de Membre du Club
 
Homme
Consultant en Business Intelligence
Inscription : mars 2011
Messages : 26
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : mars 2011
Messages : 26
Points : 11
Points : 11
SQL Pro, merci pour ton aide, c'est vrai que le plus important était de modifier le champ date pour que SQL Server comprenne le format.

Je cherchais trop à résoudre le problème coté insertion alors que c'était plus simple de modifier le select qui créé le CSV. J'ai donc contacté la personne qui me fournissé le CSV en lui demandant d'appliquer pour chaque champ la logique suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT 
	ID int NOT NULL,
 
	SUBSTR(DATE1,7,2)||
	SUBSTR(DATE1,4,2)||
	SUBSTR(DATE1,1,2) AS DATE1,
 
	...
 
FROM
        TableDate
Merci à tous pour votre participation, je suis sur que les codes sql me serviront pour une autre fois.

Bonne semaine
Amarox est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h20.


 
 
 
 
Partenaires

Hébergement Web