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 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

Schreibe einen Kommentar