4
votes

Convertir la date en chaîne dans SSIS avec le nom actuel du mois?

J'obtiens l'erreur,

Erreur lors de la conversion du type de données varchar en date.

de cette expression

@ToDate = '01-maj-2018'

DO NET Source [40]: Une erreur s'est produite lors de l'exécution de la commande SQL fournie: "EXEC [dbo.StoredProcedure] @ToDate = '01 -maj-2018 '

Erreur: 0xC004706B à l'importation (voir Expression!), SSIS.Pipeline: "ADO NET Source" a échoué à la validation et a renvoyé le statut de validation "VS_ISBROKEN".

(DT_STR,30,1252)@[User::ToDate]

Comment puis-je le changer pour que mon @ToDate soit 01-mai-2018 pas 01 -maj-2018 ?

J'ai essayé de rechercher et il y a beaucoup de questions similaires, mais pas une seule question sur cette erreur spécifique. Et pourquoi cela fait même que ma chaîne a maj?


7 commentaires

Comment passez-vous la valeur au paramètre @ToDate?


@ [User :: YYY] = EXEC dbo.XXX @ToDate = '"+ (DT_STR, 30,1252) @ [User :: ToDate] où @ [User :: ToDate] défini comme 1 sur mai


Étape à repro. 1.Définissez votre Windows pour être une langue locale. 2. Ajoutez la variable DateTime ForCollationTest et définissez la valeur sur 1 mai 2019 3. Ajoutez une autre variable (DT_WSTR, 30) (@ [User :: ForCollationTest]), le résultat sera dans la langue locale


Quel type de données est le paramètre de date dans votre procédure stockée? Si toutes les variables sont des dates, vous ne devriez jamais avoir ce problème et vous ne devriez jamais avoir à vous soucier de la conversion vers des formats spécifiques. En d'autres termes, assurez-vous que le paramètre SP est de type date et assurez-vous que la variable SSIS est également de type date. Les paramètres régionaux ne devraient pas être pertinents si vous utilisez simplement des types de données qui ne se soucient pas du format (c'est-à-dire des dates et non des chaînes)


Je génère du SQL comme Exec dbo.XXXX @ x1 = '15 maj 2019 'et cet Exec échoue


Est-ce que @ x1 est un type de données date ou datetime ? Lorsque vous avez besoin d'utiliser une chaîne littérale (comme dans ce cas), utilisez le format ISO (aaaa-mm-jj) ou transtypez-la avec un format explicite


c'est datetime. Casting vers '2019-05-15' semble une bonne solution de contournement autour du problème majeur du SSIS


3 Réponses :


0
votes

Je ne sais pas exactement sur l'erreur, mais je suppose que cela peut être dû au classement SQL Server, essayez de vérifier quel est le classement de votre serveur. Ou peut-être explorer sur les collations peut vous aider.

Classements


3 commentaires

J'ai essayé de changer les paramètres régionaux pour que le package soit en anglais, toujours en obtenant «maj».


quel est le classement de votre serveur.


SQL_Latin1_General_CP1_CI_AS



0
votes

Il semble que votre paquet ait un LocaleID différent de 1033 (anglais-US).

Cette valeur peut être ajustée au niveau du package, donc toutes les tâches sous-jacentes en hériteront.

Peut également être lié à un paramètre de langue de la connexion SQL Server si la valeur est générée côté SQL Server

Problème associé pour vérifier ce qui peut affecter les paramètres régionaux de date dans SSIS: Formats de date SSIS 2012 dmy vs mdy


0 commentaires

0
votes

Je suis d'accord avec @AlexanderVolok, il semble que le package ait un LocalID différent de l'anglais, ou que les informations de culture de date et d'heure sélectionnées dans les paramètres régionaux du système d'exploitation soient différentes.

(1) Changer le nom des mois avec conditionnel? :

Si vous pouvez modifier ces propriétés, cela peut résoudre le problème, sinon vous ajoutez une tâche d'expression avant la tâche de flux de données qui convertit la date en une chaîne de format différent en utilisant un opérateur conditionnel ? : , par exemple (en supposant que vous gérez les noms des mois polonais) :

@[User::NewDateString] = 
RIGHT((DT_WSTR,50)@[User::ToDate],4) + "-" +
RIGHT("0" + (DT_WSTR,50)DATEPART("mm", @[User::ToDate]),2) + "-" + 
LEFT((DT_WSTR,50)@[User::ToDate],2)

Ensuite, vous devez passer la nouvelle variable en paramètre .

(2) Modification du format des données en aaaa-MM-jj

Vous pouvez également utiliser une tâche d’expression , pour convertir les mois en une valeur numérique telle comme:

@[User::NewDataString] = 
LEFT((DT_WSTR,50)@[User::ToDate],2) + "-" +
(SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "maj" ? "may" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "stycz" ? "Jan" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "lut" ? "feb" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "mar" ? "mar" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "maj" ? "may" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "czerw" ? "jun" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "lip" ? "jul" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "sierp" ? "aug" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "wrzes" ? "sep" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "pazdzier" ? "oct" : 
SUBSTRING((DT_WSTR,50)@[User::ToDate], FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) + 1,  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",2) -  FINDSTRING((DT_WSTR,50)@[User::ToDate],"-",1) - 1)  == "listopad" ? "nov" : "dec" )
+ "-" + RIGHT((DT_WSTR,50)@[User::ToDate],4)

Références


1 commentaires

C'est la bonne réponse car cela fonctionne. Au moins pour ma configuration.