Mam procedurę składowaną, która wstawia 650 pól do tabeli. Błąd wstawiania z błędem obcięcia.
To proste
INSERT INTO
SELECT (a bunch of fields)
FROM (a bunch of tables)
Poniżej znajduje się komunikat o błędzie:
Msg 8152, poziom 16, stan 14, procedura DSP_Procedure, wiersz 1075 Łańcuch lub dane binarne zostałyby obcięte.
Czy istnieje szybki sposób na określenie, które pole powoduje błąd obcięcia?
Fakt, że instrukcja select, która ma zostać wstawiona do tabeli, ma 650 pól, utrudnia wskazanie, które pole powoduje błąd obcięcia.
Myślę, że mogę komentować bloki pól na raz, tak aby SP wstawiał tylko 100 pól na raz, a następnie uruchamiał SP 6 lub 7 różnych razy, aż będę mógł przynajmniej zawęzić do grupy 100 pól który będzie zawierał pole, które powoduje błąd obcięcia.
Alternatywnie myślę, że może mogę po prostu SELECT INTO
nową tabelę, a następnie porównać długości danych w tabeli z długościami danych w tabeli docelowej, do której próbuję wstawić w moim SP, aby zobaczyć, które pole zawiera dłuższą niż oczekiwana długość pola. ..
Korzystam z programu SQL Server 2014.
Jakieś łatwiejsze alternatywy?
źródło
Odpowiedzi:
Jeśli korzystasz z SQL Server 2016 (SP2, CU6 lub nowszy), jedną z opcji jest włączenie flagi śledzenia 460, np
(QUERYTRACEON 460)
. Dane wyjściowe wskażą kolumnę i obrażające dane.Szczegółowe informacje można znaleźć w tym artykule. https://www.brentozar.com/archive/2019/03/how-to-fix-the-error-string-or-binary-data-would-be-truncated/
Jeśli nie obchodzi Cię to, możesz
SET ANSI_WARNINGS OFF
zignorować ten rodzaj obcięcia.źródło
Niestety, napotkałeś dość starą „funkcję”. Bilet Connect jest otwarty od 2008 roku, a przez prawie dziesięć lat nie był on wystarczająco znaczący, aby uzasadnić naprawę.
Standardowy obejście jest, jak zorientowali, A
select into...
następnie porównanie metadane tabeli. Inną możliwością jest wyszukiwanie binarne kolumny naruszającej prawo, ale to także praca ręczna. Istnieje kilka metod porównywania metadanych, ale proste, eleganckie rozwiązanie nie istnieje. Może przydałyby się narzędzia innych firm, ale nie jestem tego świadomy.źródło
Użycie (QUERYTRACEON 460) nie działało dla mnie, gdy umieściłem je na końcu mojego zapytania.
Włączyłem go na poziomie DB i zadziałało:
Pamiętaj jednak o wyłączeniu go, gdy znajdziesz i naprawisz problem, nie zostawiaj go włączonego!
źródło