50分求一奇怪问题:有关left函数。

lumina 2003-11-20 08:12:16
declare @YJTicketNo varchar(1000)
.
.
.
.
.
--中间过程给 @YJTicketNo 赋值。值是:退票 2333963 2333964 2333965 2333966 2333967 2333968 2333969 2333970 2333971 2333972 2333973 2333974 2333975 2333976 2333977 2333978 2333979 2333980 2333981 2333982 2333983 2333984 2333985 2333986 2333987 2333988 2333989 2333990 2333991 2333992 2333993 2333994 废票 2360116 废号
.--超过254个字符的。
.
set @YJTicketNo=left(@YJTicketNo,254)
--插入表。
insert into dd106(BalYear,BalMonth,BalDay,BalDate,UserCode,TRID,BCTSSSCode,BCTSFlag,BeginTicketNo,EndTicketNo,
QRMBQP,QRMBBP,QRMBYFP,QRMBZFP,QRMBTP,QRMBSXFP,QHKDQP,QHKDBP,QHKDYFP,QHKDZFP,QHKDTP,QHKDSXFP,QFH,
SRMBQP,SRMBBP,SRMBYFP,SRMBTP,SRMBSXFP,SRMB,SHKDQP,SHKDBP,SHKDYFP,SHKDTP,SHKDSXFP,SHKD,YJTicketNo)
values(@DateYear,@DateMonth,@DateDay,@BalDate,@UserCode,@TRID,null,0,@minSTID,@maxSTID,
@QRMBQP,@QRMBBP,@QRMBYFP,@QRMBZFP,@QRMBTP,@QRMBSXFP,@QHKDQP,@QHKDBP,@QHKDYFP,@QHKDZFP,@QHKDTP,@QHKDSXFP,@QFH,
@SRMBQP,@SRMBBP,@SRMBYFP,@SRMBTP,@SRMBSXFP,@SRMB,@SHKDQP,@SHKDBP,@SHKDYFP,@SHKDTP,@SHKDSXFP,@SHKD,@YJTicketNo)
------------------
表dd106, YJTicketNo 字段是varchar(254)
这样执行时会报错:
服务器: 消息 8152,级别 16,状态 9,行 228
String or binary data would be truncated.
The statement has been terminated.

但是当我这行改成
set @YJTicketNo=left(@YJTicketNo,252)时就通过。

问:为什么会出现这种情况?







...全文
76 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lumina 2003-11-21
  • 打赏
  • 举报
回复
马可,你说的将字段改成nvarchar(254)。可以成功执行。
但是我想问问,我都系统已经运行很长时间了,这样修改,会不会引起其他的问题出现。比如对字段的赋值,取值等问题。
因为这个表直接计算操作员的缴交的钱,一旦出现问题不好办。

大力你说的改为这样不行的,问题不是定义的变量长度。但是如果将字段的长度改为4000就可以。
sunshareforever 2003-11-21
  • 打赏
  • 举报
回复
varchar[(n)]

长度为 n 个字节的可变长度且非 Unicode 的字符数据。n 必须是一个介于 1 和 8,000 之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节。所输入的数据字符长度可以为零。varchar 在 SQL-92 中的同义词为 char varying 或 character varying。


nvarchar(n)

包含 n 个字符的可变长度 Unicode 字符数据。n 的值必须介于 1 与 4,000 之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。nvarchar 在 SQL-92 中的同义词为 national char varying 和 national character varying。
zjcxc 元老 2003-11-21
  • 打赏
  • 举报
回复
不行影响其他.

只是注意存储宽度的问题:

varchar是按字节存储的.nvarchar是按字存储的

即varchar(254) 可以存储254个字母,127个汉字

nvarchar(254) 无论存储字母还是汉字,都只能存储127个
pengdali 2003-11-20
  • 打赏
  • 举报
回复
应该改为:

declare @YJTicketNo varchar(4000)

一个中文占两个字节
txlicenhe 2003-11-20
  • 打赏
  • 举报
回复
都是中文引起的。
建议改为nvarchar(254)最好。

declare @a varchar(5)
set @a = left('中国人民',4)
select @a

-----
中国

(所影响的行数为 1 行)

declare @b nvarchar(5)
set @b = left('中国人民',4)
select @b

-----
中国人民

(所影响的行数为 1 行)

lumina 2003-11-20
  • 打赏
  • 举报
回复
这种情况害我的系统,一日一个操作员没有日结,3万多块钱没有算进去。真系奇怪!

34,874

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧