首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复2008 (R2)数据库中所有表中的无效长度

问如何修复2008 (R2)数据库中所有表中的无效长度
EN

Database Administration用户
提问于 2016-03-06 14:15:10
回答 1查看 1.7K关注 0票数 -1

任务很简单:我希望使用2008 R2将所有Server数据库表导出到MySQL (或MySQL可以采取的任何其他格式,例如Excel、CSV)。

我尝试了以下几点:

  • MySQL工作台成功地创建了所有的东西,但没有复制某些表的数据
  • 中的导入/导出向导。对于所有情况(各种目标选项),在导出到Excel时都会出现有用的错误消息(请参见下面),这将失败。

在谷歌搜索的同时,数据导出也失败了,原因是有一些编码的数据长度无效。我的猜测是,一种不应该超过4000字节的编码类型是存储了超过4000字节的数据。

我在尝试导出到Excel时确认了这一点。它显示了以下错误:

错误0xc0204016: SSIS.Pipeline: "output列"Subject“(83)”的长度不是valid.,长度必须在0到4000之间。( Server导入和导出向导) HRESULT: 0xC0204016 (Microsoft.SqlServer.DTSPipelineWrap)异常

上面的错误显示在一些表上。这一点很明显,MySQL工作台实际上为未受影响的表导出数据,然后简单地为受影响的表创建表(不将数据导出给受影响的表)。

我如何解决这个问题并能够导出这些数据?(通过一个将更正所有具有此错误数据的表中的所有行的查询;或者完全更改所有具有此坏数据的表的所有行中的数据编码)。

我不能使用平面文件选项,因为我有很多表。我的中的导入/导出向导只允许一次在表上备份到平面文件。

当我试图将其中一个表导出到一个平面文件时,我会得到以下错误:

错误0xc00470d4:数据流任务1: 输入列"FederalGovSponsored“(225)上的代码页为1252,要求为65001。 ( Server导入和导出向导)错误0xc004706b:数据流任务1: ”组件“”目的- newflatfile_txt“(139)”验证失败和返回验证状态“VS_ISBROKEN "VS_ISBROKEN". ( Server导入和导出向导)错误0xc004700c:数据流任务1: 一个或多个组件验证失败。( Server导入和导出向导)

如何删除此错误?

我真的不使用Server,而是使用MySQL。数据库由不愿提供支持的其他人维护。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2016-03-06 17:10:22

这将适用于简单情况(例如,对象/列名或数据中没有时髦的Unicode字符)。

代码语言:javascript
复制
DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
EXEC master..xp_cmdshell ''bcp ' 
  + QUOTENAME(DB_NAME()) + '.'
  + QUOTENAME(s.name) + '.' 
  + QUOTENAME(t.name) 
  + ' out "C:\temp\x_' + s.name + N'_' + t.name + '.txt" -c ' -- may need -w/-N/-n
  + ' -S server\instance -Uusername -Ppassword'';'
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id];

PRINT @sql;
EXEC sys.sp_executesql @sql;

如果不能使用xp_cmdshell,则只需输出bcp命令,并从任何服务器或工作站上的命令行窗口运行这些命令,其中(a)安装了server客户端工具,(b)可以连接到数据库服务器。因此,在数据库服务器上运行这个查询,然后将输出填充到一个批处理文件中,然后在任何地方运行该批处理文件。

代码语言:javascript
复制
DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'PRINT ''bcp ' 
  + QUOTENAME(DB_NAME()) + '.'
  + QUOTENAME(s.name) + '.' 
  + QUOTENAME(t.name) 
  + ' out "C:\temp\x_' + s.name + N'_' + t.name + '.txt" -c ' -- may need -w/-N/-n
  + ' -S server\instance -Uusername -Ppassword'';'
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id];

EXEC sys.sp_executesql @sql;

这里有更多的文档(包括如何使用格式文件和使用Unicode数据):

票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/131417

复制
相关文章

相似问题

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