TSQL Fehler bei insert "Zeichenfolgen-oder Binärdaten würden abgeschnitten"
Im code unten habe ich bin zum einfügen von Werten in eine Tabelle und bekommen den Fehler "Zeichenfolgen-oder Binärdaten würden abgeschnitten."
Meine Tabelle definition:
CREATE TABLE urs_prem_feed_out_control
(
bd_pr_cntl_rec_type char(7) NULL ,
pd_pr_cntl_acctg_dte char(6) NULL ,
bd_pr_cntl_run_dte char(10) NULL ,
bd_pr_cntl_start_dte char(10) NULL ,
bd_pr_cntl_end_dte char(10) NULL ,
bd_pr_cntl_rec_count char(16) NULL ,
bd_pr_tot_premium char(16) NULL ,
bd_pr_tot_commission char(16) NULL ,
fd_ctl_nbr integer NOT NULL
)
DECLARE @cur_fd_ctl_nbr INT = 2,
@acctg_cyc_ym_2 CHAR(6) = '201402',
@rundate CHAR (10) = CONVERT(CHAR(10),GETDATE(),101),
@cycle_start_dt DATETIME = '2014-02-17',
@cycle_end_dt DATETIME = '2014-02-24',
@record_count INT = 24704,
@tot_pr_premium DECIMAL(18,2) = 476922242,
@tot_pr_comm DECIMAL(18,2) = 2624209257
Code einfügen (ich hab es deklariert die Variablen als Konstante Werte zum testen, nahm ich diese Werte aus, was Sie zur Laufzeit):
INSERT INTO urs_prem_feed_out_control
SELECT fd_ctl_nbr = @cur_fd_ctl_nbr,
bd_pr_cntl_rec_type = 'CONTROL',
bd_pr_cntl_acctg_dte = @acctg_cyc_ym_2,
bd_pr_cntl_run_dte = @rundate,
bd_pr_cntl_start_dte = CONVERT(CHAR(10),@cycle_start_dt,101),
bd_pr_cntl_end_dte = CONVERT(CHAR(10),@cycle_end_dt,101),
bd_pr_cntl_rec_count = RIGHT('0000000000000000' + RTRIM(CONVERT(CHAR(16),@record_count)),16),
bd_pr_tot_premium = CASE
WHEN @tot_pr_premium < 0
THEN '-' + SUBSTRING(RIGHT('000000000000000' + LTRIM(RTRIM(CONVERT(VARCHAR,ABS(@tot_pr_premium)*100))),18),1,15)
ELSE
'+' + SUBSTRING(RIGHT('000000000000000' + LTRIM(RTRIM(CONVERT(VARCHAR,ABS(@tot_pr_premium)*100))),18),1,15)
END,
bd_pr_tot_commission = CASE
WHEN @tot_pr_comm < 0
THEN '-' + SUBSTRING(RIGHT('000000000000000' + LTRIM(RTRIM(CONVERT(VARCHAR,ABS(@tot_pr_comm)*100))),18),1,15)
ELSE
'+' + SUBSTRING(RIGHT('000000000000000' + LTRIM(RTRIM(CONVERT(VARCHAR,ABS(@tot_pr_comm)*100))),18),1,15)
END
Wenn ich mir jeden Wert einzeln, wie es scheint, sind Sie alle innerhalb der Variablen Länge der Einschränkungen der Tabelle. Irgendeine Idee warum ich diese Fehlermeldung bekommen?
Dank!
Naja, zumindest one Sie ist zu lang - sonst würdest du nicht diese Fehlermeldung bekommen. Versuchen Sie, ersetzen Sie eine variable in einer Zeit, mit der z.B. ein
Schreiben Sie eine wählen Sie mit alle len().
Schrieb die INSERT-Anweisung um eine SELECT-mit allen len()'en. Habe 7,6,10,10,10,16,16,16 das entspricht genau der Spalte Längen. Wenn ich zurück an das EINFÜGEN bekomme ich den "Zeichenfolgen-oder Binärdaten würden abgeschnitten" Fehler!!!
Warum sind Sie mixing-Stil 101 (
Ja, ich weiß, aber wenn ich sehe wie all die anderen falschen Dinge, die ich erwähnen Sie auch.
NULL
Wert oder ein einzelnes Zeichen (z.B. *
) - wenn der Fehler verschwindet, Sie haben Ihre problematische Spalte Wert!Schreiben Sie eine wählen Sie mit alle len().
Schrieb die INSERT-Anweisung um eine SELECT-mit allen len()'en. Habe 7,6,10,10,10,16,16,16 das entspricht genau der Spalte Längen. Wenn ich zurück an das EINFÜGEN bekomme ich den "Zeichenfolgen-oder Binärdaten würden abgeschnitten" Fehler!!!
Warum sind Sie mixing-Stil 101 (
mm/dd/yyyy
) und style 120 (yyyy-mm-dd
) statt verwenden Sie ein absolut eindeutiges format wie yyyymmdd
? Warum sind Sie Umwandlung auf varchar
ohne Länge? Und warum bist du nicht auf die Auflistung der Spaltennamen in der insert-Anweisung? Beachten Sie die Spalte letzten in der Tabelle, aber erste in der select-Liste. </facepalm>Ja, ich weiß, aber wenn ich sehe wie all die anderen falschen Dinge, die ich erwähnen Sie auch.
InformationsquelleAutor intA | 2014-06-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sich das problem mit dem insert-Abfrage ist DIE REIHENFOLGE DER EINFÜGEMARKE :
Diese Spalte definiert werden muss, bei der letzten in der
INSERT
als die Letzte Spalte in der create table-Skript.Ändern Sie Ihre Abfrage:
Tun dies auch funktionieren würde. Beachten Sie, dass die erste Spalte hier in der
SELECT
innerhalb derINSERT
ist nur die Art, wie Sie Ihre Frage stellen.Siehe hier-> http://sqlfiddle.com/#!3/0e09b/1
Hoffe, das hilft!!!
Siehe den zweiten Teil der Antwort, wo die Namen der Spalten angegeben werden. Es ist ein Turnschuh, dass auch (Siehe die fiddle in der Nähe des Ende der Antwort).
Es war nicht nötig, Bearbeiten Sie die Antwort. Beide Möglichkeiten funktionieren. Es ist nur eine Frage der best practice. Jedoch persönlich glaube ich lieber & empfehlen die Angabe von Spaltennamen.
Es ist nicht eine Frage der besten Praxis, es ist eine Frage der Förderung Armen Praktiken vor allem, da die schlechte Praxis (was war das, was zu seinem problem) kam zuerst. Ich als downvoting Sie stattdessen aber gewählt zu Bearbeiten, da Sie nicht die richtige Lösung. Aber die OP brauchte, um zu sehen, dass die zweite Lösung ist das, was er sollte nicht der erste, oder diese brechen, das nächste mal stellt er die Spalten außerhalb der Reihenfolge.
Der Grund, warum Sie sehen, die "richtige Lösung" ist, weil das ist, was ich persönlich benutze und mich wohl fühle. Ich hatte tatsächlich zu Bearbeiten, dass auf meinem Arbeitsplatz zu kommen an die man mit keinen Spaltennamen. Aber ja, ich bin damit einverstanden, ich sollte erwähnt haben, dass in meiner Antwort, da dies nicht den 'richtigen Weg' für die Zukunft. Und auf einer anderen Anmerkung, es gibt viele Dinge, die falsch mit der Art, wie die Abfrage formuliert (Aaron Bertrand wirft etwas Licht auf dieses in seinen Kommentaren).
InformationsquelleAutor Satwik Nadkarny
Diesem Grund sollten Sie nie schreiben, Sie eine insert-Anweisung ohne Angabe der Spalten. Da Sie nicht haben, es wil versuchen, die Daten in den Spalten in der Reihenfolge, wie Sie in der Tabelle das ist überhaupt nicht der Bestellung haben Sie Sie in.
Andere Sache, die passieren kann, wenn man diese Art von Nachricht (aber ich glaube nicht, dass gilt auch in deinem Fall, ich schließe es für Menschen auf der Suche später), ist, dass die eeror ist eigentlich aus einem Auslöser und nicht die main einfügen.
Schließlich ein Hinweis auf Datenbank-design, sollten Sie nicht verwenden char für Termine, die Sie sollten mit Datum-Feldern. Sie nicht haben heute Mathe auf ein char-Feld und wird es akzeptieren Falsches Datum Werte wie feb30, 2014. Es ist immer eine schlechte Idee, zum speichern von Daten, die als alles, außer den Datums-oder datetime-Werte. Im Allgemeinen sollte der char nur selten verwendet, wenn eine Spalte haben immer die gleiche Anzahl von Zeichen (wie eine 2 Spalte state Abkürzung), darf es nicht verwendet werden, da der default-Datentyp. Sie tun müssen, einen besseren job zu definieren Datentypen entsprechen den Typ und Größe der gespeicherten Daten. Sie laufen in Probleme mit Abfragen als 'VA' ist nicht das gleiche wie 'VA '. Im Allgemeinen meine Erfahrung ist, dass weniger als 1% aller Datenbank-Felder sollte das Char.
InformationsquelleAutor HLGEM
Denke ich, kann es vorteilhaft sein, überprüfen Sie Ihre Arbeit. Betrachten Sie das folgende Beispiel-code:
Alle Folgendes ergeben: Zeichenfolgen-oder Binärdaten würden abgeschnitten werden.
InformationsquelleAutor Rawle