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
?
3 Réponses :
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.
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
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
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.
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 .
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
C'est la bonne réponse car cela fonctionne. Au moins pour ma configuration.
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éesdate
oudatetime
? 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 explicitec'est datetime. Casting vers '2019-05-15' semble une bonne solution de contournement autour du problème majeur du SSIS