Разграничаване между varchar с нулева дължина и NULL стойности в CSV файл

Разгледайте следния примерен CSV файл с 6 реда

"Col1","Col2", "Col3", 
"Col1Row1","Col2Row1", 1
"Col1Row2","", 
"Col1Row3",,0
"Row 4 Example of ""double quotes"" in the data","Row 4 col 2",0
"Row 5 Example of a comma, no problem, in the data","Row 5 col 2",0
"Row 6 Example of embedded CR LF right here
 in the data","Row 6 col 2",0

Свойства на файла:

  1. Заглавие на колона = Вярно
  2. Разделител на колона char = запетая
  3. Текстов разделител char = "
  4. разделител на редове = {CR}{LF}
  5. Текстов разделител в данни, представени от две последователни срещания на текстовия разделител char

Дефиниции на колони:

  1. Col1 = varchar
  2. Col2 = varchar
  3. Col3 = число

Доколкото си спомням от моите дни, когато използвах DTS, DTS пакетите нямаха проблеми с обработката на файлове, които може да съдържат разделител на колони, разделител на текст или разделител на редове в данните. освен това може също така да прави разлика между NULL и ненулеви стойности и по-специално NULL низове срещу низове с нулева дължина.

След това, което считам за достатъчно тестване, коментирах в тази публикация за препълване на стека, че вярвам, че CSV анализаторът на SSIS просто не може да обработва специални знаци в данните, напр. знаци за разделител на текст или разделител на редове в данните. Вижте Използване Excel за създаване на CSV файл със специални знаци и след това импортиране в база данни с помощта на SSIS. Все още не мога да повярвам и го споменавам отново с надежда, че греша, тъй като ми се струва непонятно, че SSIS не може да се справи с този случай и че единственото решение е да се избере текстов разделител, който не се среща в данните .

Нека обаче стигна до основния си въпрос относно NULL стойностите. Наскоро открих, че освен ако не задам свойството "Retain Null Values" на обекта File Input

въведете описание на изображението туки свойството "Запазване на нулеви стойности" на обекта на целевата таблица,

въведете описание на изображението тук

че стойностите NULL не се откриват и стойността null става стойност на varchar с нулева дължина или 0, в случай на цифрова колона за местоназначение. В моя пример по-горе считам, че следните колони на ред имат нулеви стойности:

  1. Ред 2 Колона 3
  2. Ред 3, колона 2

Тъй като моята целева база данни е SQL Server, който прави разлика между varchar с нулева дължина и null varchar, не считам стойността в колона 2 на ред 2 за null, а вместо това, varchar с нулева дължина. Въпреки това, когато данните се прехвърлят от техния примерен файл към целева таблица, която позволява нули за всички тези колони, низовете с нулева дължина се зареждат като NULL!

Тъй като настройките „Запазване на NULLs“ и „Keep Nulls“ изглежда са на ниво обект File и Table, а не на ниво колона, изглежда няма начин да „включите“ „Retain Nulls“ само за колоната, която аз очаквайте да имате нули. Например, да кажем, че имам файл с 42 varchar колони в него и за 41 една от тях се задоволявам с празни низове вместо нули, но за една колона бих искал да запазя и да разгранича NULL стойност и празна стойност на низ, има ли някакъв начин да направите това? Както нулевите колони varchar, така и стойностите на колоната varchar с нулева дължина изглежда са заредени като NULLS.

Кой е най-добрият начин да се справите с това, като използвате трансформация на извлечена колона или скриптова задача за промяна на стойността? Може ли някой да ми помогне със скрипта на C# или да предостави подробности за двата подхода или да предложи по-добър начин?

Виждал съм някои публикации в SO, в които се казва, че няма начин да се направи разлика между NULL и varchar стойност с нулева дължина в CSV файл, но вярвам, че горният пример е как го правите и че е просто въпрос как вземете анализатора на SSIS CSV, за да го анализирате правилно или ако анализаторът е на ниво.


person Chad    schedule 16.01.2013    source източник


Отговори (1)


Знам, че това не отговаря напълно на въпроса ви, но ето какво открих.

Не съм тествал свойството Keep Nulls на OLEDB Destination, защото мисля, че има малко по-различно значение. Проверявам всичките си тестове, като разглеждам Data Viewers в SSIS, изрязвайки OLEDB Destination от картината като фактор.

  1. Когато импортирате файл, който не е квалифициран като текст, без отметка на Retain Null Values, както празните колони (т.е. два разделителя без нищо между тях), така и колоните, съдържащи само интервали, се импортират такива, каквито са: като низ с нулева дължина и серия от интервали съответно.
  2. Ако отметнете Retain Null Values, колоната с нулева дължина ще бъде трансформирана в NULL, но колоната, съдържаща интервали, ще остане такава, каквато е.
  3. С текстово квалифициран файл става по-сложно. Когато Retain Null Values ​​е отметнато, просто няма начин да получите NULL от файла. Независимо дали е правилно квалифициран празен низ (напр. "", "NextColumnValue") или просто нищо (напр. "NextColumnValue"), SSIS го превръща в низ с нулева дължина.
  4. При файл с квалифициран текст и отметка на Retain Null Values, ето резултатите, както правилно квалифицираният празен низ (""), така и пълната липса на нищо между разделителите на колоните се превръщат в NULL.

Тези резултати са в съответствие с това, което сте открили. И определено не изглежда да има настройка колона по колона, която може да се коригира: като използвате квадратчето Retain Nulls, можете или да превърнете всички низове с нулева дължина (и липса на текстови квалификатори, ако е приложимо) в NULL, или можете да ги оставите като низове с нулева дължина.

person SebTHU    schedule 08.03.2016