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 29/01/2012, 14h36   #1
Membre Expert
 
Inscription : octobre 2007
Messages : 3 948
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 948
Points : 1 905
Points : 1 905
Par défaut Erreur conversion d'un type de données varchar en type de données datetime

Bonjour voici une nouvelle facétie de SQL Serveur version Française

Je viens de chercher pendant un bon bout de temps pourquoi une requete qui fonctionne tres bien chez moi me donne un message d'erreur chez un utilisateur en France

Code :
1
2
3
4
5
SELECT 
*
FROM 
Stock
WHERE DateIN >= '2012-01-18'
Citation:
Envoyé par ErrorMessage
Msg*242, Niveau*16, État*3, Ligne*2
La conversion d'un type de données varchar en type de données datetime a créé une valeur hors limites.
Et je viens de découvrir l'HORREUR !
La requete sur Date est dépendante du type d'installation du serveur !!

Le serveur de l'utilisateur est installé en Français !

Il faut alors faire
Code :
WHERE DateIN >= '18-01-2012'
et non
Code :
WHERE DateIN >= '2012-01-18'
Je pense et j'espère qu'avec une requete parametrée je devrais m'en sortir
Mais je trouve cependant cela horrible !!

J'ose a peine imaginer ce que doit donner un Back-Up restore entre les deux serveurs dans ce cas !!

Vos remarque sur mon interpretation de ce problème sont les bienvenues
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 18h50   #2
Modérateur
 
Homme
Administrateur de base de données
Inscription : août 2007
Messages : 1 159
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : Belgique

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : août 2007
Messages : 1 159
Points : 1 608
Points : 1 608
Bonjour,

Le format de la date dépend en effet de la langue utilisée pour l'installation.

Pour voir la liste des différents formats par langue installée:
Pour le francais:
Code :
1
2
 
sp_helplanguage 'French'
Pour modifier le comportement de la session, vous pouvez utiliser la commande suivante par exemple:
Code :
1
2
 
SET DATEFORMAT ymd
Pour plus d'information, cette commande et le comportement que vous décrivez sont expliqués dans la MSDN
Ptit_Dje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 10h58   #3
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
Citation:
Envoyé par olibara Voir le message
Bonjour voici une nouvelle facétie de SQL Serveur version Française
Il ne s'agit pas d'une facétie, mais d'un comportement attendu et normatif.

Le format normatif de conversion de STRING en DATETIME dans SQL Server repose sur la norme SQL qui imposait le format 'AAAAMMJJ hh:mm:ss.nnn'
Ceci jusqu'à la norme SQL1999.

Quelque soit les règles du serveur, ce format passe outre le paramétrage de langue.

A partir de SQL Server 2008, qui a rajouté les type DATE, DATETIME2 et DATETIMEOFSSET, le format normatif ayant évolué, SQL Server prends désormais 'AAAA-MM-JJ ...' UNIQUEMENT pour les nouveaux types (afin de rester rétrocompatible).

Si vous aviez cherché un peu, vous seriez tombé sur l'article que nous avons écrit à ce sujet :
http://baptiste-wicht.developpez.com...-sql/datetime/

Effectivement le paramétrage SET FORMAT permet de prendre en compte des format exotique de conversion STRING DATE.

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 30/01/2012, 12h38   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Ou sinon, toujours écrire une date avec la fonction CONVERT, comme ça plus jamais de problème de localisation.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 14h09   #5
Membre Expert
 
Inscription : octobre 2007
Messages : 3 948
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 948
Points : 1 905
Points : 1 905
Merci a tous !
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2012, 15h43   #6
Membre Expert
 
Inscription : octobre 2007
Messages : 3 948
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 948
Points : 1 905
Points : 1 905
Bonjour

A la suite de ce Post J'avais cru comprendre que le format d'interpretation generique d'une date etait

Je je decouvre que l'import export wizard n'aime pas du tout cela et qu'il exige
En résumé la regle depends toujours du contexte !!
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2012, 16h18   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 686
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Je me permets de m'auto-citer :
Citation:
Envoyé par Waldar Voir le message
Ou sinon, toujours écrire une date avec la fonction CONVERT, comme ça plus jamais de problème de localisation.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2012, 16h23   #8
Membre du Club
 
Homme
Expert SQL Server
Inscription : avril 2004
Messages : 52
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39
Localisation : France

Informations professionnelles :
Activité : Expert SQL Server

Informations forums :
Inscription : avril 2004
Messages : 52
Points : 55
Points : 55
Citation:
Envoyé par olibara Voir le message
Bonjour
Je je decouvre que l'import export wizard n'aime pas du tout cela et qu'il exige
En résumé la regle depends toujours du contexte !!
Par exemple,
Code :
convert(datetime, '2012-02-22 01:02:03', 121)
Serguei_TARASSOV est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2012, 16h43   #9
Membre Expert
 
Inscription : octobre 2007
Messages : 3 948
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 948
Points : 1 905
Points : 1 905
Merci Seguei

Mais je cherche le format me permettant de faire un import a l'aide de l'import / export Wizard (j'ai +/- 400.000 rows a importer)

yyyy-MM-dd fonctionne pour les dates ayant une valeur
Par contre si je laisse le champ vide pour une date nulle j'ai une erreur de conversion

Je cherche encore
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2012, 16h52   #10
Membre du Club
 
Homme
Expert SQL Server
Inscription : avril 2004
Messages : 52
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39
Localisation : France

Informations professionnelles :
Activité : Expert SQL Server

Informations forums :
Inscription : avril 2004
Messages : 52
Points : 55
Points : 55
Citation:
Envoyé par olibara Voir le message
Merci Seguei

Mais je cherche le format me permettant de faire un import a l'aide de l'import / export Wizard (j'ai +/- 400.000 rows a importer)

yyyy-MM-dd fonctionne pour les dates ayant une valeur
Par contre si je laisse le champ vide pour une date nulle j'ai une erreur de conversion

Je cherche encore
Es tu sûr que le pb est dans une valeur vide ? Ce code fonctionne correctement en 2008.
Code :
1
2
3
4
5
6
7
8
SELECT
  convert(datetime, src_date, 121)
FROM
  (SELECT '2012-02-22 01:02:03' AS src_date
  UNION ALL 
  SELECT '' AS src_date
  UNION ALL 
  SELECT NULL AS src_date) t
Il est probable, que t'a des valeurs comme '9999-99-99' plutôt.
Serguei_TARASSOV est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2012, 17h21   #11
Membre Expert
 
Inscription : octobre 2007
Messages : 3 948
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 948
Points : 1 905
Points : 1 905
Merci Serguei

Mais je parle maintenant d'un probleme de format de date non pas dans une commande SQL mais lors de l'usage de l'import / export Wizard

Une date ayant une valeur se presente dans une colonne tab délimitée

\t20120221\t

et nulle c'est

\t\t

Mais il semble que l'import export Wizard ne puisse pas traiter les valeurs vides !!
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2012, 10h48   #12
Membre du Club
 
Homme
Expert SQL Server
Inscription : avril 2004
Messages : 52
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39
Localisation : France

Informations professionnelles :
Activité : Expert SQL Server

Informations forums :
Inscription : avril 2004
Messages : 52
Points : 55
Points : 55
Citation:
Envoyé par olibara Voir le message
Merci Serguei

Mais je parle maintenant d'un probleme de format de date non pas dans une commande SQL mais lors de l'usage de l'import / export Wizard

Une date ayant une valeur se presente dans une colonne tab délimitée

\t20120221\t

et nulle c'est

\t\t

Mais il semble que l'import export Wizard ne puisse pas traiter les valeurs vides !!
Pour moi "Import wizard" traite correctement les valeurs vides entre les tabulations.
Voir PJ : le fichier source et la capture d’écran.
Sinon essaie BCP.
Fichiers attachés
Type de fichier : zip import_test.zip (105,2 Ko, 2 affichages)
Serguei_TARASSOV est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2012, 11h25   #13
Membre Expert
 
Inscription : octobre 2007
Messages : 3 948
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 948
Points : 1 905
Points : 1 905
Merci Serguei

Tu utilise 2005 ou 2008 ?
J'ai lu qu'en 2008 le comportement avait changé

En tout cas j'ai contourné en mettant une valeur sentinelle et par apres je fais un update
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2012, 23h15   #14
Membre du Club
 
Homme
Expert SQL Server
Inscription : avril 2004
Messages : 52
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39
Localisation : France

Informations professionnelles :
Activité : Expert SQL Server

Informations forums :
Inscription : avril 2004
Messages : 52
Points : 55
Points : 55
Citation:
Envoyé par olibara Voir le message
Merci Serguei

Tu utilise 2005 ou 2008 ?
J'ai lu qu'en 2008 le comportement avait changé

En tout cas j'ai contourné en mettant une valeur sentinelle et par apres je fais un update
Effectivement, il y a un problème en Import Wizard qui est contournée par une colonne dérivée en SSIS mais au niveau Wizard 2005 il n'y pas de solution à ma connaissance.

Alors, je te propose une méthode propre qui traite les valeurs vides comme "null" en 2005 et 2008.

Il te faut un fichier de format en plus (voir PJ)
Puis, on crée la table cible
Code :
1
2
3
4
5
CREATE TABLE dbo.import_test (
  int_value int NOT NULL,
  date_value datetime NULL,
  str_value nvarchar(255) NULL
)
Enfin, on fait l'import
Code :
1
2
3
4
5
6
7
8
9
10
11
12
BULK INSERT dbo.import_test
FROM 'P:\Temp\import_test.csv'
WITH
(
	FORMATFILE = 'C:\Temp\import_test.xml',
	ERRORFILE = 'C:\Temp\import_test.csv.err',
	BATCHSIZE = 1000000,
	CODEPAGE = 'ACP',
	MAXERRORS = 1,
	TABLOCK,
	FIRSTROW = 1
)
Espérons que cela aide
Fichiers attachés
Type de fichier : zip import_test2.zip (644 octets, 0 affichages)
Serguei_TARASSOV est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2012, 17h39   #15
Membre Expert
 
Inscription : octobre 2007
Messages : 3 948
Détails du profil
Informations forums :
Inscription : octobre 2007
Messages : 3 948
Points : 1 905
Points : 1 905
Merci Serguei

Intéressant je n'avais jamais utilisé le Bulk Insert
C'est bon a connaitre
__________________
« Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)
olibara est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h51.


 
 
 
 
Partenaires

Hébergement Web