SQL Server Insert Into - Jak zidentyfikować kolumnę, która powoduje błąd obcięcia

11

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 INTOnową 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?

Juan Velez
źródło
1
Chciałbym przejść do INFORMACJE_SCHEMA.KOLUMNY i porównać typy danych z tymi, które próbujesz wstawić. Niestety serwer SQL nie ma dynamicznych typów danych dla deklaracji zmiennych, podobnie jak ORACLE.
MguerraTorres
2
Użyłbym twojej drugiej opcji, wstawiłem do nowej (lub #temp) tabeli, a następnie porównałem długości kolumn. Lub możesz owinąć LEN () wokół wszystkich kolumn w zaznaczeniu, a następnie zlecić zewnętrznemu wykonaniu MAX () dla każdego ..., co dałoby ci największą długość tekstu dla pól. Oczywiście przy założeniu, że jest to pole, które sprawia ci problemy. Nie używasz smalldatetime lub tinyint?
Jonathan Fite,
1
Wybrałbym podejście „Wybierz w” i porównałbym długości kolumn, tak. Może z „WHERE 1 = 0”, aby tabela nie zawierała wierszy. Niezręczne, jeśli SELECT nie zawiera unikatowych nazw dla wybranych kolumn. Długie listy kolumn formatuję jako jeden wiersz skryptu na kolumnę, a następnie, w razie potrzeby, nazwę kolumny „AS” w następnym wierszu oraz pusty wiersz po czterech kolumnach, aby ułatwić utrzymanie miejsca na liście. To również obsługuje wybieranie wielu wierszy i wykonywanie kombinacji klawiszy Ctrl + K Ctrl + C, aby zmienić je na komentarze, aby można było zaatakować operację Wstaw w ten sposób, ale kolumny, które zostały pominięte, musiałyby być puste.
Robert Carnegie,

Odpowiedzi:

9

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.

vonPryz
źródło
1

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:

DBCC TRACEON(460, -1);
GO

Pamiętaj jednak o wyłączeniu go, gdy znajdziesz i naprawisz problem, nie zostawiaj go włączonego!

DBCC TRACEOFF(460, -1);
GO
Taylor Brown
źródło