Разгледайте следния примерен 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
Свойства на файла:
- Заглавие на колона = Вярно
- Разделител на колона char = запетая
- Текстов разделител char = "
- разделител на редове = {CR}{LF}
- Текстов разделител в данни, представени от две последователни срещания на текстовия разделител char
Дефиниции на колони:
- Col1 = varchar
- Col2 = varchar
- Col3 = число
Доколкото си спомням от моите дни, когато използвах DTS, DTS пакетите нямаха проблеми с обработката на файлове, които може да съдържат разделител на колони, разделител на текст или разделител на редове в данните. освен това може също така да прави разлика между NULL и ненулеви стойности и по-специално NULL низове срещу низове с нулева дължина.
След това, което считам за достатъчно тестване, коментирах в тази публикация за препълване на стека, че вярвам, че CSV анализаторът на SSIS просто не може да обработва специални знаци в данните, напр. знаци за разделител на текст или разделител на редове в данните. Вижте Използване Excel за създаване на CSV файл със специални знаци и след това импортиране в база данни с помощта на SSIS. Все още не мога да повярвам и го споменавам отново с надежда, че греша, тъй като ми се струва непонятно, че SSIS не може да се справи с този случай и че единственото решение е да се избере текстов разделител, който не се среща в данните .
Нека обаче стигна до основния си въпрос относно NULL стойностите. Наскоро открих, че освен ако не задам свойството "Retain Null Values" на обекта File Input
и свойството "Запазване на нулеви стойности" на обекта на целевата таблица,
че стойностите NULL не се откриват и стойността null става стойност на varchar с нулева дължина или 0, в случай на цифрова колона за местоназначение. В моя пример по-горе считам, че следните колони на ред имат нулеви стойности:
- Ред 2 Колона 3
- Ред 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, за да го анализирате правилно или ако анализаторът е на ниво.