SQL2000的表里一列 数据类型是varchar(40)能存下DataLength 是 41 的字符么?

sdlwhgw 2013-09-23 05:38:53
最近碰到了这样一个问题。
我要把一张表的数据从 SQLServer2000 同期到 SQLServer2008 里。

2000 和 2008 的表的结构是一模一样的。
在2008的查询分析器里执行的是

INSERT INTO tabele2008
SELECT prodname ,列2 ,***
FROM [XXX.XXX.XXX.XXX].DB1.dbo.tabele2000

执行的时候直接报错
链接服务器 'XXX.XXX.XXX.XXX' 的 OLE DB 访问接口 'SQLNCLI10' 返回了对列 XXX.XXX.XXX.XXX].DB1.dbo.tabele2000.prodname'无效的数据。

而在2000 的查询分析器里执行
SELECT prodname ,列2 ,***
FROM DB1.dbo.tabele2000 却没有错误。

具体看了一下数据
发生问题的字段 prodname 这个字段定义是 varchar(40) 里面存的是商品的名字
把商品的名字拷贝出来 用 SELECT Datalength()看是 41 这样的数据也能存到数据库里么?

怎么解释 在2008查询分析器 执行出错的原因?


...全文
277 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcmakebest 2013-10-09
  • 打赏
  • 举报
回复
很怀疑楼主所言:2000 和 2008 的表的结构是一模一样的 建表语句导出大家来看,楼主是近视吧!
sdlwhgw 2013-10-09
  • 打赏
  • 举报
回复
引用 8 楼 HEROWANG 的回复:
2000 和 2008 的表的结构是一模一样的。 在2008的查询分析器里执行的是 INSERT INTO tabele2008 SELECT prodname ,列2 ,*** FROM [XXX.XXX.XXX.XXX].DB1.dbo.tabele2000 执行的时候直接报错 链接服务器 'XXX.XXX.XXX.XXX' 的 OLE DB 访问接口 'SQLNCLI10' 返回了对列 XXX.XXX.XXX.XXX].DB1.dbo.tabele2000.prodname'无效的数据。 而在2000 的查询分析器里执行 SELECT prodname ,列2 ,*** FROM DB1.dbo.tabele2000 却没有错误。 看下你的两个操作,一个是插入,一个是查询。当插入的时候,超过长度,自然插入不进去;
这个地方 单独执行 SELECT prodname ,列2 ,*** FROM [XXX.XXX.XXX.XXX].DB1.dbo.tabele2000 也是会报错的, 应该和插入没有关系。和 LinkServer 有关系。
Cloud_Hero 2013-09-24
  • 打赏
  • 举报
回复
应该是跟你的字符集有关。如果你用nvarchar()应该就没有问题了。
sdlwhgw 2013-09-24
  • 打赏
  • 举报
回复
引用 3 楼 chen870201 的回复:
估计和字符集也有关系吧
觉得有可能吧,但是没有更好的解释么?
xiaoxiangqing 2013-09-24
  • 打赏
  • 举报
回复
超过长度了,保存不了
chen870201 2013-09-24
  • 打赏
  • 举报
回复
估计和字符集也有关系吧
sdlwhgw 2013-09-24
  • 打赏
  • 举报
回复
引用 1 楼 hdhai9451 的回复:
它的length()为41,你把它的内容帖出来看看。 它的长度已经超过了字段定义的长度,你改为prodname varchar(100),问题不就解决了吗?
谢谢您的回答。 商品的名字是: 【寿司ネタ】生キハダマグロスライス_10・ 把字段改一下长度确实能解决这个问题,为什么这样的数据还能插到表里呢? 为什么2000 查询不报错,2008报错? 还有 一个奇怪的现象 在2000环境下 假设 Table1 就一个字段 类型是varchar(40) INSERT INTO Table1   SELECT Prodname FROM DB1.dbo.tabele2000 WHERE Prodname = '【寿司ネタ】生キハダマグロスライス_10・' 是可以执行成功的, 但是 INSERT INTO Table1 SELECT '【寿司ネタ】生キハダマグロスライス_10・' 就是失败了,报字段太长的错误。
唐诗三百首 2013-09-24
  • 打赏
  • 举报
回复
估计是含有特殊字符, 可以用dbcc page()查看一下数据页的内容.
  • 打赏
  • 举报
回复
2000 和 2008 的表的结构是一模一样的。 在2008的查询分析器里执行的是 INSERT INTO tabele2008 SELECT prodname ,列2 ,*** FROM [XXX.XXX.XXX.XXX].DB1.dbo.tabele2000 执行的时候直接报错 链接服务器 'XXX.XXX.XXX.XXX' 的 OLE DB 访问接口 'SQLNCLI10' 返回了对列 XXX.XXX.XXX.XXX].DB1.dbo.tabele2000.prodname'无效的数据。 而在2000 的查询分析器里执行 SELECT prodname ,列2 ,*** FROM DB1.dbo.tabele2000 却没有错误。 看下你的两个操作,一个是插入,一个是查询。当插入的时候,超过长度,自然插入不进去;
sdlwhgw 2013-09-24
  • 打赏
  • 举报
回复
关键什么情况下才能放进去啊? 2000,2008执行的结果也不一样。
Andy__Huang 2013-09-23
  • 打赏
  • 举报
回复
它的length()为41,你把它的内容帖出来看看。 它的长度已经超过了字段定义的长度,你改为prodname varchar(100),问题不就解决了吗?

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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