Korzystam z pliku data.bat z następującymi wierszami:
Rem Tis batch file will populate tables
cd\program files\Microsoft SQL Server\MSSQL
osql -U sa -P Password -d MyBusiness -i c:\data.sql
Zawartość pliku data.sql to:
insert Customers
(CustomerID, CompanyName, Phone)
Values('101','Southwinds','19126602729')
Jest jeszcze 8 podobnych linii do dodawania rekordów.
Gdy uruchomię to z start
> run
> cmd
> c:\data.bat
, otrzymuję komunikat o błędzie:
1>2>3>4>5>....<1 row affected>
Msg 8152, Level 16, State 4, Server SP1001, Line 1
string or binary data would be truncated.
<1 row affected>
<1 row affected>
<1 row affected>
<1 row affected>
<1 row affected>
<1 row affected>
Również jestem nowicjuszem oczywiście, ale co zrobić Level #
, a state #
średni, i jak mogę sprawdzić komunikaty o błędach, takich jak ten powyżej: 8152?
źródło
Firstname nvarchar(5)
Jeśli wstawisz więcej niż 5 znaków, pojawi się błądMiałem ten problem, chociaż długość danych była mniejsza niż długość pola. Okazało się, że problemem była kolejna tabela dziennika (dla ścieżki audytu), wypełniona wyzwalaczem w głównej tabeli, w której również trzeba było zmienić rozmiar kolumny.
źródło
W jednej z
INSERT
instrukcji próbujesz wstawić zbyt długi ciąg do ciągu (varchar
nvarchar
kolumny lub ).Jeśli nie jest oczywiste
INSERT
, kto jest sprawcą, wystarczy samo spojrzenie na skrypt, możesz policzyć<1 row affected>
linie, które występują przed komunikatem o błędzie. Otrzymana liczba plus jeden daje numer wyciągu. W twoim przypadku wydaje się, że to drugi WSTAW, który powoduje błąd.źródło
Niektóre dane nie mieszczą się w kolumnie bazy danych (małe). Nie jest łatwo znaleźć to, co jest złe. Jeśli używasz C # i Linq2Sql, możesz wymienić pole, które byłoby obcięte:
Najpierw utwórz klasę pomocnika:
Następnie przygotuj opakowanie dla funkcji Prześlij zmiany:
Przygotuj globalną procedurę obsługi wyjątków i szczegóły obcinania dziennika:
Na koniec użyj kodu:
źródło
Chcę tylko przekazać dodatkowe informacje: miałem ten sam problem i to dlatego, że pole nie było wystarczająco duże dla przychodzących danych i ten wątek pomógł mi go rozwiązać (pierwsza odpowiedź wyjaśnia wszystko).
ALE bardzo ważne jest, aby wiedzieć, jakie są możliwe przyczyny, które mogą to powodować.
W moim przypadku tworzyłem tabelę z polem takim jak to:
Dlatego pole „Okres” miało długość zero i powodowało niepowodzenie operacji wstawiania. Zmieniłem go na „XXXXXX”, czyli długość przychodzących danych, i teraz działało to poprawnie (ponieważ pole miało teraz długość 6).
Mam nadzieję, że pomoże to każdemu, kto ma ten sam problem :)
źródło
Inną sytuacją, w której można uzyskać ten błąd, jest:
Miałem ten sam błąd, a przyczyną było to, że w instrukcji INSERT, która otrzymywała dane z UNII, kolejność kolumn była inna niż w oryginalnej tabeli. Jeśli zmienisz kolejność w # table3 na a, b, c, naprawisz błąd.
źródło
na serwerze sql możesz użyć SET ANSI_WARNINGS OFF w następujący sposób:
źródło
Miałem ten sam problem. Długość mojego kolumny był zbyt krótki.
Możesz zwiększyć długość lub skrócić tekst, który chcesz umieścić w bazie danych.
źródło
Ten problem występował również na powierzchni aplikacji sieci web. W końcu okazało się, że ten sam komunikat o błędzie pochodzi z instrukcji aktualizacji SQL w określonej tabeli.
Wreszcie ustalono, że definicja kolumny w powiązanych tabelach historii nie odwzorowała oryginalnej długości kolumn
nvarchar
typów tabeli w niektórych szczególnych przypadkach.źródło
Miałem ten sam problem, nawet po zwiększeniu rozmiaru problematycznych kolumn w tabeli.
tl; dr: Długość pasujących kolumn w odpowiednich typach tabel może również wymagać zwiększenia.
W moim przypadku błąd pochodził z usługi eksportu danych w Microsoft Dynamics CRM, która pozwala na synchronizację danych CRM z bazą danych SQL Server lub Azure SQL DB.
Po długim dochodzeniu doszedłem do wniosku, że usługa eksportu danych musi używać parametrów wycenionych w tabeli :
Jak widać w powyższej dokumentacji, typy tabel są używane do tworzenia procedury przetwarzania danych:
Niestety nie ma sposobu na zmianę typu tabeli, więc należy go całkowicie usunąć i odtworzyć. Ponieważ moja tabela ma ponad 300 pól (😱), utworzyłem zapytanie, aby ułatwić utworzenie odpowiedniego typu tabeli na podstawie definicji kolumn tabeli (wystarczy zastąpić
[table_name]
nazwą tabeli):Po zaktualizowaniu typu tabeli usługa eksportu danych znów zaczęła działać poprawnie! :)
źródło
Podczas próby wykonania procedury składowanej miałem ten sam problem, ponieważ rozmiar kolumny, którą muszę dodać, jest mniejszy niż danych, które chcę dodać.
Możesz zwiększyć rozmiar typu danych kolumny lub skrócić długość danych.
źródło
Inną sytuacją, w której może wystąpić ten błąd, jest SQL Server Management Studio. Jeśli masz w tabeli pola „tekst” lub „ntext”, bez względu na to, jakie pole aktualizujesz (na przykład bit lub liczba całkowita). Wydaje się, że Studio nie ładuje całych pól „ntext”, a także aktualizuje WSZYSTKIE pola zamiast zmodyfikowanego. Aby rozwiązać problem, wyklucz pola „tekst” lub „ntext” z zapytania w Management Studio
źródło
Potrzebowałem komentarza Kevina Pope'a pod przyjętą odpowiedzią.
Problem w moim przypadku polegał na tym, że w mojej tabeli zdefiniowane zostały wyzwalacze, które wstawiałyby aktualizacje / wstawianie transakcji do tabeli kontroli, ale tabela kontroli miała niezgodność typu danych, w której kolumna z
VARCHAR(MAX)
oryginalnej tabeli była przechowywana jakVARCHAR(1)
w tabeli kontroli, więc moje wyzwalacze zawiodły, gdy wstawiłem coś większego niżVARCHAR(1)
w oryginalnej kolumnie tabeli i otrzymałem ten komunikat o błędzie.źródło
Użyłem innej taktyki, pól, które w niektórych miejscach mają przypisane 8K. Tutaj używa się tylko około 50/100.
Chciałem prędkości, ponieważ mam 1M rekordów i załaduję 28K z nich.
źródło