2017-10-16 5 views
0

Toutes mes excuses pour les nombreuses questions de base - Je suis très novice en matière de SQL et j'essaie toujours de résoudre le problème. Je souhaite insérer des enregistrements de ma table de transfert vers une autre table de ma base de données, en supprimant les doubles guillemets dans le fichier source avec une fonction 'replace' et en convertissant les données de nvarchar (table de transfert) en datetime2. Je ne peux pas travailler tout à fait comment faire ceci: si je boucle le « cas où » dans « remplacer », comme ci-dessous, puis SQL ne reconnaît pas mes données et nulls it out:Bouclage d'une instruction CASE WHEN et REPLACE dans SQL

CASE WHEN ISDATE (REPLACE([Column1], '"', '')) = 1 
    THEN CONVERT(datetime2, Column1, 103) 
        ELSE null END 

Toutefois, si Je boucle mon « remplacer » dans mon « cas où », comme ci-dessous, SQL me donne un message d'erreur indiquant qu'il est incapable de convertir nvarchar en datetime2:

LTRIM(REPLACE([Column1], '"', '') 
    ,CASE WHEN ISDATE(Column1) = 1 THEN CONVERT(datetime2, Column1, 103) 
        ELSE null END 

Quel ordre/syntaxe dois-je besoin d'utiliser les pour y parvenir? Un exemple du champ de données serait: « 16/10/2017 »

Il télécharge à ma table de mise en scène comme nvarchar « 16/10/2017 »

et je voudrais passer dans mon table2 comme datetime2: 16/10/2017

+0

Pouvez-vous poster quelques exemples de données et la sortie désirée? – Leonidas199x

+0

Êtes-vous en mesure de télécharger les données dans un format moins ambigu comme «yyyymmdd»? – iamdave

Répondre

2

au lieu de isdate(), utilisez try_convert():

TRY_CONVERT(datetime2, LTRIM(REPLACE([Column1], '"', ''), 103) 

Je pense que votre confusion est que vous devez faire la manipulation de chaînes avant la conversion. Pour ce faire, la manipulation de chaîne doit être un argument de la conversion.

+0

Merci pour votre réponse! Oui, c'est la logique dont j'ai besoin, mais je ne sais pas trop comment la syntaxe - malheureusement, cela me donne toujours «null» en tant que valeurs. – Sam109

+0

Désolé - excuses pour mon commentaire précédent - cela a fonctionné! Merci beaucoup! – Sam109

1

Vous le faites correctement. Le problème est, convert a besoin de valeur sans " ", et donc votre converti a échoué.

Essayez ça:

select 
CASE WHEN ISDATE (REPLACE([Column1], '"', '')) = 1 
    THEN CONVERT(datetime2, (REPLACE([Column1], '"', '')), 103) 
    ELSE null END 
from #tbl 

plus de détails: cast and convert doc

+0

Merci - malheureusement j'obtiens toujours l'erreur suivante: "La conversion a échoué lors de la conversion de la date et/ou l'heure de la chaîne de caractères." – Sam109

+0

@ Sam109: affiche des exemples de données. Parce que dans mes données d'exemple, ce code fonctionne. –