2015-04-01 3 views
0

Я использую SSIS для загрузки файла Flat с фиксированной длиной в SQL.Плоский файл SSIS с числовым типом данных с пробелами

У меня есть поле вес, которое давало мне неприятности весь день. Он имеет длину 8 с 6 ПОДОБНЫМИ ПОЛОЖЕНИЯМИ (99V990099).

Проблема, которая возникает у меня, когда она не заполнена и имеет 8 пробелов.

Все я стараюсь получает ошибку:.

«Недопустимое значение символа для брошенной спецификации»» ИЛИ „Конверсия не удалось, так как значение данных переполнена указанного типа“преобразование ИЛИ данных не удалось ... преобразование данных для столбца «REL_WEIGHT» возвращается значение состояния 2 и текст статуса «значение не может быть преобразован из-за возможной потери данных.».

Я попытался объявить его как DT_String & DT_Numeric.

Я пробовал много вариантов:

TRIM([REL_WEIGHT])=="" ? (DT_STR,8,1252)NULL(DT_STR,8,1252) : REL_WEIGHT 

ISNULL([REL_WEIGHT]) || TRIM([REL_WEIGHT]) == "" ? (DT_NUMERIC,8,6)0 : (DT_NUMERIC,8,6)[REL_WEIGHT] 

TRIM(REL_WEIGHT) == "" ? (DT_NUMERIC,8,6)0 : (DT_NUMERIC,8,6)REL_WEIGHT 

Но ничто не похоже на работу.

Пожалуйста, у кого-то есть исправление для этого!

ответ

0

Я думаю, вы можете быть запущены прервали следующую точку, хорошо объясняется в http://vsteamsystemcentral.com/cs21/blogs/applied_business_intelligence/archive/2009/02/01/ssis-expression-language-and-the-derived-column-transformation.aspx:

You can add a DT_STR Cast statement to the expression for the MiddleName, but it doesn't change the Data Type. Why can't we change the data type for existing columns in the Derived Column transformation? We're replacing the values, not changing the data type. Is it impossible to change the data type of an existing column in the Derived Column? Let's put it this way: It is not possible to convert the data type of a column when you are merely replacing the value. You can, however, accomplish the same goal by creating a new column in the Data Flow.

Я решил это на прошлых случаях путем загрузки данных из плоского файла в виде строк, а затем получения новый столбец в преобразовании производного столбца, который имеет числовой тип. Затем вы можете выполнить соответствующую подгонку, проверку, кастинг и т. Д. В выражении SSIS для этого нового столбца в преобразовании.

Здесь я нашел выражение примера SSIS я использовал в одной точке, чтобы получить значение времени из 4-значного ряда:

(ISNULL(Last_Update_Time__orig) || TRIM(Last_Update_Time__orig) == "") ? NULL(DT_DBTIME2,0) : (DT_DBTIME2,0)(SUBSTRING(TRIM(Last_Update_Time__orig),1,2)+":"+SUBSTRING(TRIM(Last_Update_Time__orig),3,2)+":00") 
+0

Я создал 2 новые столбцы в моем SQL таблицы. 1 как Char (8) и 1 как INT вместе с Колонкой уже там как Десятичный (8,6).Так что все, что я пытаюсь, у меня есть место, чтобы загружать все, чтобы найти что-то, что работает. –

+0

Когда вы говорите «столбец уже есть как десятичный (8,6)», вы имеете в виду, что вы загрузили данные плоского файла с использованием целевых типов данных, т. Е. Десятичного для столбца «REL_WEIGHT»? Это неверно; вам нужно загрузить его как строковый тип, потому что вы должны его проверить, прежде чем преобразовать его в десятичный. – bgoldst

+0

IIRC, редактор диспетчера соединений с плоским файлом, где вы настраиваете начальные типы нагрузки. Вы должны установить их в строки в этом редакторе. Обратившись к примеру кода, вставленному в мой ответ, я первоначально загрузил столбец (названный 'Last_Update_Time__orig') из плоского файла как DT_STR, а затем код получил новый столбец (названный им' Last_Update_Time') как DT_DBTIME2. – bgoldst

0

Там должен быть лучшим способом сделать это, но я нашел способ, который работает.

Создать производную колонку Выражение: TRIM (REL_WEIGHT) == ""? (DT_STR, 9,1252) «0,0000000»: (DT_STR, 9,1252) (LEFT (REL_WEIGHT, 2) + «.» + RIGHT (REL_WEIGHT, 6))

THEN Создайте задачу преобразования данных, чтобы изменить ее на цифровую и установить шкалу на 6.

А затем сопоставьте [Копировать NewField] в поле таблицы SQL, установленное как Decimal (8,6).

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

Спасибо, Джефф

+0

Существует лучший способ, который заключается в преобразовании непосредственно в десятичное число в преобразовании Derived Column. Как я уже сказал в своем ответе, вы можете создать столбец * new * в преобразовании Derived Column. Это делается путем указания нового имени (отличного от оригинала) в редакторе преобразований. Для моего примера у меня был «Last_Update_Time_orig» в качестве исходного столбца строки, а преобразование Derived Column создало новый столбец с именем «Last_Update_Time» из выражения SSIS, которое я скопировал в свой ответ. 'Last_Update_Time' - это то, что я сопоставил с столбцом таблицы БД. – bgoldst

+0

Вот хороший снимок экрана редактора: http://2.bp.blogspot.com/_3KpWw7vcPX4/S9W0-ayJ7kI/AAAAAAAAAHc/TgqyL6OTLtc/s1600/SSIS2008_expressionEditor_no_coerce-797014.png. Обратите внимание на текст ' '. – bgoldst

+0

Что касается типа данных, IIRC, он получается автоматически из выражения SSIS. Таким образом, вы должны получить правильные выражения в выражении, чтобы получившийся тип выражения был десятичным (с желаемым масштабом). Обратите внимание, что в моем примере выражения SSIS я указываю 'NULL (DT_DBTIME2,0)' как первый вариант тройного, а второй вариант имеет '' (DT_DBTIME2,0) 'cast. Таким образом, обе стороны согласованы по типу, и все выражение переходит к типу времени. Вы должны сделать то же самое (но с типом '(DT_DECIMAL, 6)') в своем выражении. – bgoldst

Смежные вопросы