首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >插入时出现TSQL错误“字符串或二进制数据将被截断”

插入时出现TSQL错误“字符串或二进制数据将被截断”
EN

Stack Overflow用户
提问于 2014-06-24 02:07:57
回答 3查看 32.4K关注 0票数 4

在下面的代码中,我将值插入到一个表中,并得到错误“字符串或二进制数据将被截断”。

我的表定义:

代码语言:javascript
运行
复制
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

插入代码(为了测试,我已经将变量声明为常量值,我从运行时获取这些值):

代码语言:javascript
运行
复制
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

当我单独查看每个值时,它们似乎都在表的可变长度约束内。你知道为什么我会得到这个错误吗?

谢谢!

EN

Stack Overflow用户

发布于 2014-06-24 02:53:43

这就是为什么在不指定列的情况下永远不要编写insert语句的原因。由于您没有这样做,它将尝试将列中的数据按照它们在表中的顺序放置,而表中的顺序与您的顺序完全不同。

当你收到这类消息时,可能会发生的另一件事(但我认为这不适用于你的情况,我将其包含在后面的搜索中)是,eeror实际上来自触发器,而不是主插入。

最后一个关于数据库设计的注意事项,你不应该使用char作为日期,你应该使用日期字段。您不能在char字段上进行日期计算,并且它将接受不正确的日期值,如feb30,2014。将日期存储为除date或datetime值之外的任何值都不是一个好主意。一般而言,只有当一列始终具有相同数量的字符(如两列状态缩写)时,才应很少使用char,它不应用作默认数据类型。您需要更好地定义与所存储数据的类型和大小相匹配的数据类型。你可能会在查询中遇到问题,因为'VA‘和'VA’不是一回事。一般来说,我的经验是所有数据库字段中只有不到1%的字段应该是Char。

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24372512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档