将非Unicode字符串转换为Unicode字符串SSIS


9

我正在创建一个程序包,将从数据库中将数据导出到一个空的excel文件中。当我仅添加源组件和目标组件并运行程序包时,出现转换错误,指出“输出”列和“ A”列无法在Unicode和非Unicode字符串数据类型之间进行转换。

为了解决这个问题,我添加了一个数据转换组件并将所有列转换为

“ Unicode字符串[DT_WSTR]”

而且我不再收到该错误。唯一的问题是,我有大约50列,其中我必须一比一地从下拉列表中选择“ Unicode字符串[DT_WSTR]”。然后,我不得不进入目标组件并将新转换的列映射到我的excel文件。

我的问题是,如果还有其他人遇到过这种情况,是否有更好的更有效的方法来解决必须进行所有手动数据类型转换的问题?必须逐一转换和映射所有列似乎不切实际,尤其是在您有大量行的情况下。

我了解excel文件不是导入和导出数据的最佳方法,但这是在特定情况下所需要的。

我可能会寻找一种只导出到纯文本文件,然后尝试转换为excel的方法,这是该程序包的最后一步。我希望这不会触发相同的unicode / nonunicode转换错误。


之后您的腕管综合症如何?:-)
帕特里克·诺诺雷斯

确保将数据移至的表使用Unicode数据类型(即:nvarchar(50)而不是varchar(50))
MacGyver,

Answers:


15

作为RDC的替代方法,我只是跳过在SSIS中转换数据类型,并在源查询中将它们显式转换为nvarchar。

用法

在源查询中(并且您正在使用源查询,不仅仅是在下拉列表中选择表),将内容显式转换为适当的n(var)char长度。

代替

SELECT
    E.BusinessEntityID
,   E.NationalIDNumber
,   E.LoginID
,   E.JobTitle
,   E.BirthDate
,   E.MaritalStatus
,   E.Gender
FROM
    HumanResources.Employee AS E

使用诸如

SELECT
    CAST(E.BusinessEntityID AS nvarchar(10)) AS BusinessEntityID
,   CAST(E.NationalIDNumber AS nvarchar(15)) AS NationalIDNumber
,   CAST(E.LoginID AS nvarchar(256)) AS LoginID
,   CAST(E.JobTitle AS nvarchar(50)) AS JobTitle
,   CAST(E.BirthDate AS nvarchar(10)) AS BirthDate
,   CAST(E.MaritalStatus AS nchar(1)) AS MaritalStatus
,   CAST(E.Gender AS nchar(1)) AS Gender
FROM
    HumanResources.Employee AS E

精通AdventureWorks的学生会认识到数据已经是一种n(var)char类型,但这仅仅是为了演示这一概念。

好处

  • 使用更少的内存。当前,您将通过使用Data Conversion ComponentSSIS 分配和存储“相同”数据的两个副本
  • 没有RSI。无需单击N次并在它们提供的可怕的小编辑器中指定所有信息。我将对dmv / information_schema使用查询,以进一步自动生成“ Excel ready”表导出。
  • 没有自定义组件安装。我曾在安装开源软件的地方工作过。由于现在“每个人”都需要安装相同的应用程序来维护您的代码并且需要在服务器上进行安装, Infosec需要仔细检查程序集以确保它们有效因此安装第三方应用程序也存在递延的维护成本。而且我们需要超过您的数以亿计的人的批准...

1
“替代RDC”-什么是RDC?当我继续阅读下一个答案时,我认为您的意思可能是“替换数据组件”,但是由于原始帖子的作者没有提及该组件,因此使用缩写词可能为时过早。:-)
Thronk

谈到RSI,CONVERT应该比粘贴50倍容易CAST,因为论点在前面
Patrick Honorez


2

如果您只需要从“ Unicode字符串(DT_WSTR)”更改为“字符串(DT_STR)”,反之亦然,则可以这样做:

  1. 保存您的package.dtsx-文件的副本(以防万一您必须恢复)
  2. 在编辑器中打开package.dtsx,或在MS Visual Studio中右键单击该包,然后选择“查看代码”。您将看到一个XML文件。

搜索字符串,DTS:DataType如果其后跟=“ 130”,则列定义为DT_WSTR(unicode)。

如果其后跟=“ 129”,则该列被定义为DT_STR(非unicode),请谨慎使用搜索并替换(您之前制作过副本,对吗?)

保存文件,也许就是这样。


1
欢迎使用DBA SE!专家提示:该网站具有多种文本格式设置功能,可让您的帖子看起来更美观。使用编辑器文本框顶部的图标。
peterh-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.