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.


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.


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.


2
Nie dotyczy to jednak „obcinania”. Już tego próbowałem.
— Mathias Lykkegaard Lorenzen,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.