Jestem zaangażowany w projekt migracji danych. Otrzymuję następujący błąd, gdy próbuję wstawić dane z jednej tabeli do innej tabeli (SQL Server 2005):
Msg 8152, poziom 16, stan 13, wiersz 1
Ciąg lub dane binarne zostałyby obcięte.
Źródłowe kolumny danych są zgodne z typem danych i mieszczą się w definicjach długości kolumn tabeli docelowej, więc nie wiem, co może powodować ten błąd.
sql-server
tsql
sql-server-2005
migration
data-migration
Jim Evans
źródło
źródło
Odpowiedzi:
Będziesz musiał opublikować definicje tabeli dla tabel źródłowych i docelowych, abyśmy mogli ustalić, gdzie jest problem, ale najważniejsze jest to, że jedna z kolumn w tabeli źródłowej jest większa niż kolumny docelowe . Możliwe, że zmieniasz formaty w sposób, którego nie byłeś świadomy. Model bazy danych, z którego się przenosisz, jest również ważny przy określaniu tego.
źródło
Jak już powiedzieli inni, jeden z typów danych kolumn w tabeli źródłowej jest większy niż kolumny docelowe.
Prostym rozwiązaniem jest po prostu wyłączenie ostrzeżenia i zezwolenie na obcięcie. Jeśli więc otrzymujesz ten błąd, ale masz pewność, że obcięcie (przycięcie do rozmiaru) danych w starej bazie danych / tabeli jest dopuszczalne, możesz po prostu wykonać następujące czynności;
Jak powyżej, zawsze pamiętaj, aby później ponownie włączyć ostrzeżenia. Mam nadzieję, że to pomoże.
źródło
Problem jest dość prosty: co najmniej jedna kolumna w zapytaniu źródłowym zawiera dane, które przekraczają długość kolumny docelowej. Prostym rozwiązaniem byłoby pobranie zapytania źródłowego i wykonanie go
Max(Len( source col ))
w każdej kolumnie. To znaczy,Następnie porównaj te długości z długościami typów danych w tabeli docelowej. Co najmniej jeden, przekracza długość swojej kolumny docelowej.
Jeśli masz absolutną pewność, że tak nie jest i nie obchodzi Cię, czy tak nie jest , innym rozwiązaniem jest wymuszenie rzutowania kolumn zapytania źródłowego na ich docelową długość (co spowoduje obcięcie wszelkich danych, które są zbyt długie):
źródło
SQL Server 2019 w końcu zwróci bardziej znaczący komunikat o błędzie.
Aby włączyć nowe zachowanie, musisz użyć
DBCC TRACEON(460)
. Nowy tekst błędu odsys.messages
:Dane ciągowe lub binarne zostaną obcięte: zastąpienie niesławnego błędu 8152
SQL Server 2017 CU12 obsługuje również tę funkcję.
Ulepszenie: Opcjonalne zastąpienie komunikatu „Ciąg lub dane binarne zostaną obcięte” z rozszerzonymi informacjami w programie SQL Server 2017
db <> fiddle demo
źródło
Innym potencjalnym powodem jest to, że masz domyślną konfigurację wartości dla kolumny, która przekracza długość kolumny. Wygląda na to, że ktoś gruby dotknął palcem kolumny o długości 5, ale domyślna wartość przekraczała długość 5. To doprowadziło mnie do szału, ponieważ próbowałem zrozumieć, dlaczego nie działa na żadnej wkładce, nawet jeśli wszystko, co wstawiałem, to pojedyncza kolumna z liczbą całkowitą równą 1. Ponieważ domyślna wartość w schemacie tabeli miała tę naruszającą wartość domyślną, wszystko zepsuło - co, jak sądzę, prowadzi nas do nauczonej lekcji - unikaj umieszczania w schemacie tabel z wartością domyślną. :)
źródło
W przypadku pozostałych sprawdź również swoją procedurę składowaną . W moim przypadku w mojej procedurze składowanej
CustomSearch
przypadkowo zadeklarowałem za małą długość dla mojej kolumny, więc kiedy wprowadziłem duże zbiory danych, otrzymałem ten błąd, mimo że mam dużą długość w mojej bazie danych. Właśnie zmieniłem długość mojej kolumny w wyszukiwaniu niestandardowym, błąd zniknął. To jest tylko dla przypomnienia. Dzięki.źródło
Może to być trudny błąd. Oto kilka notatek z https://connect.microsoft.com/SQLServer/feedback/details/339410/ poszukaj komentarza AmirCharania.
Dostosowałem odpowiedź udzieloną przez AmirCharania dla danych wybranych do rzeczywistej tabeli zamiast tymczasowej. Najpierw wybierz zestaw danych do tabeli programistycznej, a następnie uruchom następujące czynności:
źródło
Oto nieco inna odpowiedź. Wszystkie nazwy i długości kolumn mogą się zgadzać, ale być może w instrukcji SELECT określasz kolumny w złej kolejności. Powiedzmy, że tabela X i tabela Y mają kolumny o tej samej nazwie, ale w innej kolejności
źródło
Dzisiaj natknąłem się na ten problem, a szukając odpowiedzi na ten minimalny informacyjny komunikat o błędzie, znalazłem również ten link:
https://connect.microsoft.com/SQLServer/feedback/details/339410/please-fix-the-string-or-binary-data-would-be-truncated-message-to-give-the-column-name
Wygląda więc na to, że Microsoft nie planuje w najbliższym czasie rozwinąć komunikatu o błędzie.
Więc zwróciłem się do innych środków.
Skopiowałem błędy do excela:
(Dotyczy 1 wierszy)
(Dotyczy 1 wierszy)
(Dotyczy 1 wierszy) Msg 8152, poziom 16, stan 14, wiersz 13 Dane ciągowe lub binarne zostałyby obcięte. Oświadczenie zostało zakończone.
(Dotyczy 1 wierszy)
policzyłem liczbę wierszy w programie Excel, zbliżyłem się do licznika rekordów, który spowodował problem ... dostosowałem mój kod eksportu, aby wydrukować najbliższy kod SQL ... następnie uruchomiłem wstawki 5-10 sql wokół problemu sql i udało się wskazać problem pierwszy, zobaczyć ciąg, który był zbyt długi, zwiększyć rozmiar tej kolumny, a następnie duży plik importu nie działał.
Trochę hackowania i obejścia, ale kiedy wyszedłeś z bardzo małym wyborem, robisz, co możesz.
źródło
Tak, ja też mam takie problemy.
Tutaj zmieniłem długość wpisanego UWAGI z 500 na 1000
źródło
Dodam jeszcze jedną możliwą przyczynę tego błędu tylko dlatego, że nikt o tym nie wspomniał i może to pomóc jakiejś przyszłej osobie (skoro PO znalazł odpowiedź). Jeśli tabela, do której wstawiasz, ma wyzwalacze, może to być wyzwalacz generujący błąd. Widziałem, jak to się dzieje, kiedy definicje pól tabeli zostały zmienione, ale tabele audytu nie.
źródło
Tak - „kufel do półlitrowego garnka nie trafi”. Nie miałem dużo szczęścia (z jakiegokolwiek powodu) z różnymi SP, które ludzie sugerowali, ALE tak długo, jak dwie tabele są w tej samej bazie danych (lub możesz je umieścić w tej samej bazie danych), możesz użyć INFORMATION_SCHEMA. KOLUMNY do zlokalizowania błędnego pola (pól), a zatem:
Umożliwi to przewijanie w górę iw dół, porównując długości pól w trakcie. Skomentowane sekcje pozwalają zobaczyć (oczywiście po odkomentowaniu), czy występują niezgodności typów danych, lub konkretnie pokazują te, które różnią się długością pola - ponieważ jestem zbyt leniwy, aby przewijać - po prostu pamiętaj, że cała rzecz jest oparta na źródle nazwy kolumn zgodne z docelowymi.
źródło
Używałem pustego ciągu „” podczas tworzenia tabeli, a następnie otrzymywałem błąd „Msg 8152, Ciąg lub dane binarne zostaną obcięte” przy kolejnej aktualizacji. Działo się tak z powodu wartości aktualizacji zawierającej 6 znaków i większej niż przewidywana definicja kolumny. Użyłem „SPACJI”, aby obejść ten problem, tylko dlatego, że wiedziałem, że będę aktualizować zbiorczo po utworzeniu początkowych danych, tj. Kolumna nie będzie długo pozostawać pusta.
TAK DUŻA OSTRZEŻENIE: To nie jest szczególnie sprytne rozwiązanie, ale jest przydatne w przypadku, gdy gromadzisz zestaw danych, np. W przypadku jednorazowych żądań wywiadowczych, w których tworzysz tabelę do eksploracji danych, stosując pewne przetwarzanie / interpretację masową i przechowywanie wyników przed i po do późniejszego porównania / wydobycia. To częste zjawisko w mojej pracy.
Możesz początkowo wypełnić słowo kluczowe SPACE, tj
Późniejsze aktualizacje parametru „nazwa_kolumny” składającego się z 10 lub mniej znaków (w razie potrzeby należy je zastąpić) będą wtedy dozwolone bez powodowania błędu obcięcia. Ponownie użyłbym tego tylko w scenariuszach podobnych do opisanego w moim zastrzeżeniu.
źródło
Zbudowałem procedurę składowaną, która analizuje tabelę źródłową lub kwerendę z kilkoma cechami na kolumnę, w tym minimalną długością (min_len) i maksymalną długością (max_len).
Przechowuję tę procedurę w głównej bazie danych, aby móc jej używać w każdej bazie danych, tak jak:
A wynik to:
column description constraint_type fk_table fk_column pos default null data_type length precision radix is_unique min_len max_len nulls blanks numerics distincts distinct_values remarks
id_individual NULL PRIMARY KEY NULL NULL 1 NULL NO int NULL 10 10 1 1 2 0 0 70 70 Many (70) unique,all numeric,
id_brand NULL NULL NULL NULL 2 NULL NO int NULL 10 10 0 1 1 0 0 70 2 2,3 same length,all numeric, guid NULL NULL NULL NULL 3 (newid()) NO uniqueidentifier NULL NULL NULL 1 36 36 0 0 0 70 Many (70) unique,same length,
customer_id NULL NULL NULL NULL 4 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
email NULL NULL NULL NULL 5 NULL YES varchar 100 NULL NULL 0 4 36 0 0 0 31 Many (31)
mobile NULL NULL NULL NULL 6 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
initials NULL NULL NULL NULL 7 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
title_short NULL NULL NULL NULL 8 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
title_long NULL NULL NULL NULL 9 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
firstname NULL NULL NULL NULL 10 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
lastname NULL NULL NULL NULL 11 NULL YES varchar 50 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
address NULL NULL NULL NULL 12 NULL YES varchar 100 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
pc NULL NULL NULL NULL 13 NULL YES varchar 10 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
kixcode NULL NULL NULL NULL 14 NULL YES varchar 20 NULL NULL 0 NULL NULL 70 0 0 0 NULL all null,empty,
date_created NULL NULL NULL NULL 15 (getdate()) NO datetime NULL NULL NULL 1 19 19 0 0 0 70 Many (70) unique,same length,
created_by NULL NULL NULL NULL 16 (user_name()) NO varchar 50 NULL NULL 0 13 13 0 0 0 1 loyalz-public same length,
id_location_created NULL FOREIGN KEY location id_location 17 NULL YES int NULL 10 10 0 1 1 0 0 70 2 1,2 same length,all numeric, id_individual_type NULL FOREIGN KEY individual_type id_individual_type 18 NULL YES int NULL 10 10 0 NULL NULL 70 0 0 0 NULL all null,empty,
optin NULL NULL NULL NULL 19 NULL YES int NULL 10 10 0 1 1 39 0 31 2 0,1 same length,
źródło
sp_
prefiksu dla procedur składowanych. Firma Microsoft zarezerwowała ten prefiks do własnego użytku (zobacz Procedury składowane nazewnictwa ) i istnieje ryzyko kolizji nazw w przyszłości. Jest to również szkodliwe dla wydajności procedury składowanej . Najlepiej po prostu unikaćsp_
i używać czegoś innego jako przedrostka - lub nie używać go wcale!Napisałem przydatną procedurę przechowywania, aby pomóc zidentyfikować i rozwiązać problem obcinania tekstu (dane ciągi lub dane binarne byłyby obcięte), gdy używana jest instrukcja INSERT SELECT. Porównuje tylko pola CHAR, VARCHAR, NCHAR I NVARCHAR i zwraca ocenę pole po polu w przypadku, gdy jest to możliwa przyczyna błędu.
KOD FUNKCJI:
Na razie obsługuje tylko typy danych CHAR, VARCHAR, NCHAR i NVARCHAR . Możesz znaleźć ostatnią wersję tego kodu w następnym linku poniżej i pomagamy sobie nawzajem w ulepszaniu go. GetFieldStringTruncate.sql
https://gist.github.com/jotapardo/210e85338f87507742701aa9d41cc51d
źródło
Jeśli korzystasz z programu SQL Server 2016-2017: aby to naprawić, włącz flagę śledzenia 460
i upewnij się, że wyłączyłeś go po:
źródło
źródło
może się to również zdarzyć, gdy nie masz odpowiednich uprawnień
źródło
Miałem podobny problem. Kopiowałem dane z jednej tabeli do identycznej tabeli we wszystkim oprócz nazwy.
Ostatecznie zrzuciłem tabelę źródłową do tabeli tymczasowej za pomocą instrukcji SELECT INTO.
Porównałem schemat tabeli źródłowej z tabelą tymczasową. Odkryłem, że jedna z kolumn była a,
varchar(4000)
kiedy spodziewałem się plikuvarchar(250)
.AKTUALIZACJA: Kwestię varchar (4000) można wyjaśnić tutaj, jeśli jesteś zainteresowany:
W przypadku Nvarchar (Max) otrzymuję tylko 4000 znaków w TSQL?
Mam nadzieję że to pomoże.
źródło
Ten błąd jest generowany, gdy kolumna tabeli nakłada ograniczenie [głównie długość]. . Np. Jeśli schemat bazy danych dla kolumny myColumn to CHAR (2), to gdy wywołujesz z dowolnej aplikacji, aby wstawić wartość, musisz przekazać ciąg o długości dwa.
Błąd w zasadzie mówi to; ciąg o długości trzy i powyżej jest niespójny i nie pasuje do ograniczenia długości określonego przez schemat bazy danych. Dlatego SQL Server ostrzega i zgłasza błąd utraty / obcięcia danych.
źródło
Spróbuj następującego kodu:
źródło