Конвертировать дату в строку в SSIS с текущим названием месяца? - PullRequest
0 голосов
/ 20 февраля 2019

Я получаю ошибку,

Ошибка преобразования типа данных varchar в дату.

из этого выражения

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

DONET Source [40]: Произошла ошибка при выполнении предоставленной команды SQL: «EXEC [dbo.StoredProcedure] @ToDate = '01 -maj-2018 '

Ошибка: 0xC004706B при импорте (см. Выражение!), SSIS.Pipeline: «Источник ADO NET» не прошел проверку и вернул статус проверки «VS_ISBROKEN».

@ToDate = '01-maj-2018'

Как я могу изменить его, чтобы мой @ToDate был 01-may-2018, а не 01-maj-2018?

Я попытался найти, и есть много похожих вопросов, но ни одного вопроса об этой конкретной ошибке. И почему он даже заставляет мою строку иметь maj?

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Кажется, ваш пакет имеет LocaleID, отличный от 1033 (английский-США).

Это значение можно настроить на уровне пакета, поэтому все базовые задачи будут его наследовать.

Может бытьтакже относится к настройке языка для входа в SQL Server, если значение генерируется на стороне SQL Server

Связанная проблема для проверки того, что может повлиять на локаль даты в SSIS: Форматы даты SSIS 2012 dmy vs mdy

0 голосов
/ 21 февраля 2019

Я согласен с @AlexanderVolok, похоже, что пакет имеет LocalID, отличный от английского, или информация о культуре даты и времени, выбранная в региональных настройках операционной системы, отличается.

(1) Изменить название месяца с помощью условного?:

Если вы можете изменить это свойство, это может решить проблему, в противном случае вы добавите Задание выражения перед Задачей потока данных, которая преобразует дату в строку с другим форматом, используя условное выражение.оператор ? :, как пример (при условии, что вы обрабатываете названия месяцев) :

@[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)

Затем вы должны передать новую переменную в качестве параметра.

(2) Изменение формата данных на гггг-ММ-дд

Вы также можете использовать задачу выражения , чтобы преобразовать месяцы в числовое значение, например:

@[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)

Ссылки

0 голосов
/ 20 февраля 2019

Не знаю точно об ошибке, но я предполагаю, что это может быть связано с SQL Server Collation, попробуйте проверить, каков ваш сервер сортировки.Или, может быть, изучение сопоставлений может помочь вам.

Сопоставления

...