Nie można przeliczyć wartości z powodu potencjalnej utraty danych [zamknięte]

12

Zacznę od wyjaśnienia, że nie jest to duplikat pytania ani potencjalny duplikat w tym zakresie. Próbowałem zaimplementować każdą odpowiedź na każdy wariant, który już istnieje w tym problemie na StackOverflow i DBA Stack Exchange, bez powodzenia.

Walczyłem z tym problemem przez ostatnie dwa dni (pracowałem nad nim przez około 7 godzin dziennie), a nawet po Googlingu wydaje się, że nikt inny nie ma dokładnie tego samego wariantu mojego problemu.

Co ja próbuję zrobić

W SSIS próbuję odczytać z pliku CSV i wstawić z niego wiersze do bazy danych OLE DB. W tym celu stworzyłem najprostszą konfigurację, jak pokazano poniżej.

  1. Flat File Source - czyta wiersze CSV.
  2. Derived Column - obecnie nic nie robi (służy tylko do eksperymentowania).
  3. Data Conversion - obecnie nic nie robi (służy tylko do eksperymentowania).
  4. OLE DB Destination - przechowuje wiersze w bazie danych.

Gdy próbuję go uruchomić, przestaje on działać w miejscu docelowym OLE DB z następującym komunikatem o błędzie.

Wystąpił błąd z kolumną wejściową „Kwota” (187) na wejściu „Wejście docelowe OLE DB” (51). Zwrócony status kolumny to: „Nie można przekonwertować wartości z powodu potencjalnej utraty danych.”.

Kolumna fail ( Amount) jest obecnie typu DT_STR. Wydaje się, że jest to typ, w który teraz najbardziej wierzę.

Co próbowałem?

  • Próbowałem użyć funkcji Flat File Connection„Zaproponuj typy” w kolumnie, która nie działa. To sprawiło, że polecił Single byte signed inttyp danych.
    • Zatrzymuje się w moim źródle plików płaskich .
    • Błąd polega na tym, że konwersja danych nie powiodła się. Konwersja danych dla kolumny „Kwota” zwróciła wartość stanu 2 i tekst statusu „Wartości nie można przekonwertować z powodu potencjalnej utraty danych.”.
  • Próbowałem użyć Derived Columndo rzutowania kolumny na DT_I4.
    • Zatrzymuje się w mojej kolumnie pochodnej .
    • Błąd polega na tym, że konwersja danych nie powiodła się. Konwersja danych dla kolumny „Kwota” zwróciła wartość stanu 2 i tekst statusu „Wartości nie można przekonwertować z powodu potencjalnej utraty danych.”.
  • Próbowałem użyć Data Conversiondo rzutowania wartości mojej kolumny na a DT_I4.
    • Zatrzymuje się na moim Data Conversion.
    • Błąd polega na tym, że konwersja danych nie powiodła się. Konwersja danych dla kolumny „Kwota” zwróciła wartość stanu 2 i tekst statusu „Wartości nie można przekonwertować z powodu potencjalnej utraty danych.”.
  • Próbowałem zmienić długość mojej DT_STRwartości w źródle i miejscu docelowym.
    • Zatrzymuje się na źródle lub miejscu docelowym w zależności od ustawień.
  • Próbowałem połączyć się za pomocą łącznika źródłowego Excel zamiast z dodanym ciągiem połączenia i bez niego IMEX=1. Brak szczęścia.

Mój zmysł programistyczny mówi mi, że jestem wkręcony. Nigdy nie spotkałem tak dużego problemu z tak prostą rzeczą.

I dlaczego nie mogę po prostu zignorować „potencjalnej” utraty danych? To naprawdę frustrujące co najmniej.

Mój system

Jest to komputer z systemem Windows Server 2008 R2 z zainstalowanym programem SQL Server 2008. Samo urządzenie jest w pełni aktualizowane za pośrednictwem Windows Update.

Mathias Lykkegaard Lorenzen
źródło
Wygląda na to, że miałem ten problem z wartością (chociaż pobierałem z Access) i musiałem użyć określonej strony kodowej podczas rzutowania kolumny. Nie mam już dostępu do pakietu SSIS, aby sprawdzić, co zrobiłem.
Jaki jest typ danych kolumny, do której próbujesz wstawić Amount?
Jon of All Trades
2
Otwórz Menedżera połączeń plików płaskich dla pliku CSV. Przejdź na kartę Zaawansowane i wybierz Amountkolumnę. Zrób zrzut ekranu i zaktualizuj swoje pytanie o to zdjęcie.
billinkc
Czy miałeś już okazję przyjrzeć się Menedżerowi połączeń?
billinkc
1
Nie sądzę, żebyś miał problemy, ale nie widząc definicji Menedżera połączeń, nie można powiedzieć.
billinkc,

Odpowiedzi:

3

Natknąłem się na to kilka razy i problemem było niedopasowanie typów danych w parametrach eksportu / importu. Najpierw sprawdź te parametry, klikając prawym przyciskiem myszy źródło lub miejsce docelowe, wybierając Advanced Editor. Przejdź do Właściwości wejścia i wyjścia i sprawdź typ danych dla tej kolumny dla wszystkich elementów - zarówno Zewnętrznych, Wyjściowych, jak i Wejściowych. Zazwyczaj widziałem tutaj wariancję, często jeden z nich to Unicode (WSTR), a drugi I4 lub DSTR.

Mikrofon
źródło
8

Ignorowanie błędu

Przede wszystkim powinieneś być w stanie zignorować obcięcie łańcucha, przechodząc do źródła pliku płaskiego, wyjścia błędu, a następnie zmieniając „Komponent awarii” w „Truncation” na „Ignoruj ​​błąd”.

Lepsze rozwiązanie

Prawdziwym problemem może być to, że długość ciągu wewnątrz potoku SSIS jest nadal niepoprawna, ponieważ została zainicjowana w pewnym wcześniejszym momencie.

Możesz ustalić, czy tak jest, klikając dwukrotnie zieloną strzałkę ze źródła pliku płaskiego (lub po konwersji kolumny pochodnej / danych) i wybierając „Metadane”. Tam możesz zobaczyć długość pola wewnątrz rurociągu.

Jeśli często widziałem, że metadane nie są już zgodne ze składnikiem źródłowym, głównie w przypadku tworzenia płaskiego źródła pliku ORAZ jego odpowiedniego połączenia za pomocą kreatora.

Moją sugestią byłoby usunięcie połączenia i Flat File Source i odtworzenie ich, ponieważ nie znalazłem sposobu na ponowne sychronizowanie meta-danych potoku za pomocą komponentów źródłowych.

Oliver Rahner
źródło
2
Nie dotyczy to jednak „obcinania”. Już tego próbowałem.
Mathias Lykkegaard Lorenzen,