TSQL d'erreur lors de l'insertion de chaînes de caractères ou des données binaires seront tronquées”

Dans le code ci-dessous je suis insertion de valeurs dans un tableau et d'obtenir l'erreur "de la Chaîne ou des données binaires d'être tronquée."

Ma définition de la table:

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

Insérer le code (je l'ai déclaré les variables comme des constantes les valeurs pour le test, j'ai pris ces valeurs à partir de ce qu'ils étaient au moment de l'exécution):

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

Quand je regarde chaque valeur individuellement, il semble qu'ils sont tous à l'intérieur de la longueur variable des contraintes de la table. Aucune idée de pourquoi j'obtiens cette erreur?

Merci!

Eh bien, au moins un est trop long sinon vous ne seriez pas obtenir cette erreur. Essayez de remplacer une variable à la fois, par exemple avec un NULL valeur ou un caractère unique (par exemple,*) - lorsque l'erreur disparaît, vous avez vos délinquance de la valeur de la colonne!
Écrire un select avec tous les len().
Réécriture de l'instruction INSERT pour un SELECT avec tous les len ()'. Obtenu 7,6,10,10,10,16,16,16 qui correspond exactement à la colonne longueurs. Quand je reviens à l'INSERTION-je obtenir la "Chaîne de caractères ou des données binaires seront tronquées" erreur!!!
Pourquoi êtes-vous en mélange de style 101 (mm/dd/yyyy) et le style de 120 (yyyy-mm-dd) au lieu de à l'aide d'un absolument sans équivoque format comme yyyymmdd? Pourquoi êtes-vous la conversion de varchar sans longueur? Et pourquoi n'êtes-vous pas la liste des noms de colonnes dans votre instruction insert? Avis de la colonne qui est dernier dans votre table, mais premier dans votre liste de sélection. </facepalm>
Oui, je sais, mais quand je vois toutes ces mauvaises choses, je dois parler d'eux, trop.

OriginalL'auteur intA | 2014-06-23