Ich bin an einem Datenmigrationsprojekt beteiligt. Beim Versuch, Daten aus einer Tabelle in eine andere Tabelle einzufügen (SQL Server 2005), wird folgende Fehlermeldung angezeigt:
Meldung 8152, Ebene 16, Status 13, Zeile 1
Zeichenfolge oder Binärdaten werden abgeschnitten.
Die Quelldatenspalten stimmen mit dem Datentyp überein und befinden sich innerhalb der Längendefinitionen der Zieltabellenspalten, sodass ich nicht weiß, was diesen Fehler verursachen könnte.
sql-server
tsql
sql-server-2005
migration
data-migration
Jim Evans
quelle
quelle
Antworten:
Sie müssen die Tabellendefinitionen für die Quell- und Zieltabellen veröffentlichen, damit wir herausfinden können, wo das Problem liegt. Unter dem Strich ist jedoch eine Ihrer Spalten in der Quelltabelle größer als Ihre Zielspalten . Es kann sein, dass Sie Formate auf eine Weise ändern, die Sie nicht kannten. Das Datenbankmodell, von dem Sie wechseln, ist ebenfalls wichtig, um dies herauszufinden.
quelle
Wie bereits erwähnt, ist einer Ihrer Spaltendatentypen in der Quelltabelle größer als Ihre Zielspalten.
Eine einfache Lösung besteht darin, die Warnung einfach auszuschalten und das Abschneiden zuzulassen. Wenn Sie diesen Fehler erhalten, aber sicher sind, dass Daten in Ihrer alten Datenbank / Tabelle abgeschnitten (zugeschnitten) werden, können Sie einfach Folgendes tun:
Denken Sie wie oben immer daran, die Warnungen danach wieder einzuschalten. Ich hoffe das hilft.
quelle
Das Problem ist ganz einfach: Eine oder mehrere der Spalten in der Quellabfrage enthalten Daten, die die Länge der Zielspalte überschreiten. Eine einfache Lösung wäre, Ihre Quellabfrage zu nehmen und
Max(Len( source col ))
für jede Spalte auszuführen . DhVergleichen Sie dann diese Längen mit den Datentyplängen in Ihrer Zieltabelle. Mindestens eine überschreitet die Zielspaltenlänge.
Wenn Sie absolut sicher sind, dass dies nicht der Fall sein sollte und es egal ist, ob dies nicht der Fall ist , besteht eine andere Lösung darin, die Quellabfragespalten zwangsweise auf ihre Ziellänge umzustellen (wodurch zu lange Daten abgeschnitten werden):
quelle
SQL Server 2019 gibt endlich eine aussagekräftigere Fehlermeldung zurück.
Um neues Verhalten zu aktivieren, müssen Sie verwenden
DBCC TRACEON(460)
. Neuer Fehlertext vonsys.messages
:Zeichenfolgen- oder Binärdaten würden abgeschnitten: Ersetzen des berüchtigten Fehlers 8152
SQL Server 2017 CU12 unterstützt diese Funktion ebenfalls.
Verbesserung: Optionaler Ersatz für die Meldung "Zeichenfolge oder Binärdaten werden abgeschnitten" mit erweiterten Informationen in SQL Server 2017
db <> Geigen-Demo
quelle
Ein weiterer möglicher Grund hierfür ist, dass Sie einen Standardwert für eine Spalte eingerichtet haben, der die Länge der Spalte überschreitet. Es sieht so aus, als hätte jemand eine Spalte mit einer Länge von 5 gefingert, aber der Standardwert überschritt die Länge von 5. Dies machte mich verrückt, als ich zu verstehen versuchte, warum es bei keinem Einsatz funktionierte, selbst wenn alles, was ich einfügte, war Eine einzelne Spalte mit einer Ganzzahl von 1. Da der Standardwert im Tabellenschema diesen verletzenden Standardwert hatte, hat dies alles durcheinander gebracht - was uns zu der gewonnenen Erkenntnis bringt -, vermeiden Sie es, Tabellen mit Standardwerten im Schema zu haben. :) :)
quelle
Überprüfen Sie für die anderen auch Ihre gespeicherte Prozedur . In meinem Fall habe
CustomSearch
ich in meiner gespeicherten Prozedur versehentlich nicht genügend Länge für meine Spalte angegeben. Bei der Eingabe von Big Data habe ich diesen Fehler erhalten, obwohl meine Datenbank eine große Länge enthält. Ich habe gerade die Länge meiner Spalte in meiner benutzerdefinierten Suche geändert. Der Fehler verschwindet. Dies ist nur zur Erinnerung. Vielen Dank.quelle
Dies kann ein herausfordernder Fehler sein. Hier sind einige Notizen von https://connect.microsoft.com/SQLServer/feedback/details/339410/ Folgenden Suchen Sie nach AmirCharanias Kommentar.
Ich habe die Antwort von AmirCharania für Daten angepasst, die in einer tatsächlichen Tabelle anstelle einer temporären Tabelle ausgewählt wurden. Wählen Sie zuerst Ihren Datensatz in einer Entwicklungstabelle aus und führen Sie dann Folgendes aus:
quelle
Ich bin heute auf dieses Problem gestoßen und habe auf meiner Suche nach einer Antwort auf diese minimale informative Fehlermeldung auch diesen Link gefunden:
https://connect.microsoft.com/SQLServer/feedback/details/339410/please-fix-the-string-or-binary-data-would-be-truncated-message-to-give-the-column-name
Microsoft hat also anscheinend keine Pläne, die Fehlermeldung bald zu erweitern.
Also wandte ich mich anderen Mitteln zu.
Ich habe die Fehler kopiert, um sie zu übertreffen:
(1 Zeile (n) betroffen)
(1 Zeile (n) betroffen)
(1 Zeile (n) betroffen) Nachricht 8152, Ebene 16, Status 14, Zeile 13 Zeichenfolge oder Binärdaten werden abgeschnitten. Die Anweisung wurde beendet.
(1 Zeile (n) betroffen)
zählte die Anzahl der Zeilen in Excel, näherte sich dem Datensatzzähler, der das Problem verursacht hatte ... passte meinen Exportcode an, um die SQL in der Nähe auszudrucken ... und führte dann die 5 - 10 SQL-Einfügungen um das Problem SQL und aus Es gelang, das Problem zu lokalisieren, die zu lange Zeichenfolge zu sehen, die Größe dieser Spalte zu erhöhen und dann die große Importdatei ohne Probleme auszuführen.
Ein bisschen wie ein Hack und eine Problemumgehung, aber wenn Sie mit sehr wenig Auswahl abgereist sind, tun Sie, was Sie können.
quelle
Ja, ich stehe auch vor solchen Problemen.
Hier habe ich die Länge der BEMERKUNGEN von 500 auf 1000 geändert
quelle
Ich werde eine weitere mögliche Ursache für diesen Fehler hinzufügen, nur weil niemand ihn erwähnt hat und er möglicherweise einer zukünftigen Person hilft (da das OP seine Antwort gefunden hat). Wenn die Tabelle, in die Sie einfügen, Trigger enthält, kann dies sein, dass der Trigger den Fehler generiert. Ich habe dies gesehen, als Tabellenfelddefinitionen geändert wurden, Audittabellen jedoch nicht.
quelle
Ja - "ein Pint in einen halben Pint Topf geht nicht". Ich hatte nicht viel Glück (aus welchem Grund auch immer) mit den verschiedenen SPs, die die Leute vorgeschlagen haben, ABER solange sich die beiden Tabellen in derselben Datenbank befinden (oder Sie sie in dieselbe Datenbank bringen können), können Sie INFORMATION_SCHEMA verwenden. SPALTEN, um die fehlerhaften Felder zu lokalisieren, also:
Auf diese Weise können Sie nach oben und unten scrollen und dabei die Feldlängen vergleichen. In den kommentierten Abschnitten können Sie (natürlich einmal unkommentiert) sehen, ob Datentypinkongruenzen vorliegen, oder speziell diejenigen anzeigen, die sich in der Feldlänge unterscheiden - weil ich zu faul bin, um zu scrollen -, aber beachten Sie, dass das Ganze auf der Quelle basiert Spaltennamen, die mit denen des Ziels übereinstimmen.
quelle
Hier ist eine etwas andere Antwort. Ihre Spaltennamen und -längen stimmen möglicherweise alle überein, aber möglicherweise geben Sie die Spalten in Ihrer SELECT-Anweisung in der falschen Reihenfolge an. Angenommen, tableX und tableY haben Spalten mit demselben Namen, jedoch in unterschiedlicher Reihenfolge
quelle
Ich habe bei der Tabellenerstellung eine leere Zeichenfolge '' verwendet und dann bei der nachfolgenden Aktualisierung den Fehler 'Nachricht 8152, Zeichenfolge oder Binärdaten werden abgeschnitten' erhalten. Dies geschah aufgrund des Aktualisierungswerts, der 6 Zeichen enthielt und größer als die erwartete Spaltendefinition war. Ich habe "SPACE" verwendet, um dies zu umgehen, nur weil ich wusste, dass ich nach der ersten Datenerstellung in großen Mengen aktualisieren würde, dh die Spalte würde nicht lange leer bleiben.
SO GROSSE CAVEAT HIER: Dies ist keine besonders raffinierte Lösung, aber nützlich, wenn Sie einen Datensatz zusammenstellen, z. B. für einmalige Geheimdienstanforderungen, bei denen Sie eine Tabelle für das Data Mining erstellen, eine Massenverarbeitung / -interpretation anwenden und Speichern vor und nach den Ergebnissen für einen späteren Vergleich / Abbau. Dies ist ein häufiges Ereignis in meiner Branche.
Sie können zunächst mit dem Schlüsselwort SPACE füllen, d. H.
Nachfolgende Aktualisierungen von "Spaltenname" mit maximal 10 Zeichen (ggf. Ersatz) sind dann zulässig, ohne dass ein Fehler beim Abschneiden verursacht wird. Auch hier würde ich dies nur in Szenarien verwenden, die den in meinem Vorbehalt beschriebenen ähnlich sind.
quelle
Ich habe eine gespeicherte Prozedur erstellt, die eine Quelltabelle oder Abfrage mit mehreren Merkmalen pro Spalte analysiert, darunter die minimale Länge (min_len) und die maximale Länge (max_len).
Ich speichere diese Prozedur in der Master-Datenbank, damit ich sie in jeder Datenbank wie folgt verwenden kann:
Und die Ausgabe ist:
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,
quelle
sp_
Präfix für gespeicherte Prozeduren. Microsoft hat dieses Präfix für den eigenen Gebrauch reserviert (siehe Benennen gespeicherter Prozeduren ) , und Sie laufen Gefahr, irgendwann in der Zukunft einen Namenskonflikt zu erleiden. Dies ist auch schlecht für die Leistung Ihrer gespeicherten Prozedur . Es ist am besten, einfachsp_
etwas anderes zu vermeiden und als Präfix zu verwenden - oder überhaupt kein Präfix!Ich habe eine nützliche Speicherprozedur geschrieben, um das Problem der Textabschneidung (Zeichenfolge oder Binärdaten werden abgeschnitten) zu identifizieren und zu beheben, wenn die INSERT SELECT-Anweisung verwendet wird. Es vergleicht nur die Felder CHAR, VARCHAR, NCHAR UND NVARCHAR und gibt Feld für Feld eine Auswertung zurück, falls dies die mögliche Fehlerursache ist.
FUNKTIONSCODE:
Unterstützt derzeit nur die Datentypen CHAR, VARCHAR, NCHAR und NVARCHAR . Die letzte Version dieses Codes finden Sie im nächsten Link unten. Wir helfen uns gegenseitig, ihn zu verbessern. GetFieldStringTruncate.sql
https://gist.github.com/jotapardo/210e85338f87507742701aa9d41cc51d
quelle
Wenn Sie mit SQL Server 2016-2017 arbeiten: Aktivieren Sie das Trace-Flag 460, um das Problem zu beheben
und stellen Sie sicher, dass Sie es ausschalten, nachdem:
Quelle
quelle
Dies kann auch passieren, wenn Sie nicht über ausreichende Berechtigungen verfügen
quelle
Ich hatte ein ähnliches Problem. Ich habe Daten von einer Tabelle in eine identische Tabelle in allem außer dem Namen kopiert.
Schließlich habe ich die Quelltabelle mit einer SELECT INTO-Anweisung in eine temporäre Tabelle geschrieben.
Ich habe das Schema der Quelltabelle mit der temporären Tabelle verglichen. Ich fand eine der Spalten eine,
varchar(4000)
als ich eine erwartetevarchar(250)
.UPDATE: Das Problem varchar (4000) kann hier erklärt werden, falls Sie interessiert sind:
Für Nvarchar (Max) bekomme ich nur 4000 Zeichen in TSQL?
Hoffe das hilft.
quelle
Dieser Fehler wird ausgelöst, wenn die Spalte einer Tabelle eine Einschränkung [meistens Länge] enthält. . Wenn beispielsweise das Datenbankschema für die Spalte myColumn CHAR (2) ist, müssen Sie beim Aufruf einer Anwendung zum Einfügen eines Werts einen String der Länge zwei übergeben.
Der Fehler sagt es im Grunde; Zeichenfolge mit der Länge drei und höher ist inkonsistent, um der im Datenbankschema angegebenen Längenbeschränkung zu entsprechen. Aus diesem Grund warnt SQL Server vor Datenverlust / Kürzungsfehler.
quelle
Bitte versuchen Sie den folgenden Code:
quelle