【问题标题】:Cannot convert between unicode and non-unicode string data types in SSIS无法在 SSIS 中的 unicode 和非 unicode 字符串数据类型之间转换
【发布时间】:2017-06-11 16:25:58
【问题描述】:

我已经建立了一个 SSIS 解决方案,我使用 SQL Server 导入“原始数据”并将它们转换为合适的数据类型并将它们保存到表中。对于我有问题的列,我已经这样做了(注意我只想要日期,而不是时间值,这就是我使用112 作为参数的原因):

SELECT CONVERT(nvarchar(15),a.DeliveryDate,112) AS DeliveryDate
INTO MyNewTable
FROM MyRawDataTable

然后我在 Visual Basic 中使用 MyNewTable 作为我的 SSIS 的输入。在数据流中,我右键单击我的源 OLE DB 并确保数据类型实际上是 DT_WSTR,长度为 15,位于 Advanced OptionsInput and Output datatypes 下。

当我尝试运行我的 SSIS 时出现错误

无法在 unicode 和非 unicode 字符串数据类型之间转换

我认为这可能与a.DeliveryDate 有时包含 NULL 值有关。因此,我将SQL server 中的代码调整为:

SELECT 
CONVERT(nvarchar(15),COALESCE(a.DeliveryDate,'1900-01-01 00:00:00.000'),112) AS DeliveryDate
INTO MyNewTable
FROM MyRawDataTable

然后运行我的 SSIS。我注意到我的输出中仍然有长度为15DT_WSTR,来自SSIS 中的OLE DB 导入。不过,这也会导致同样的错误。

如何让我的程序运行?我尝试的是在我的 SQL 表中将数据类型转换为 varchar,使用 COALESCE(...,0) 而不是使用 1900 年作为虚拟值。

请注意,解决方案不能在 SSIS 的数据流中包含数据转换转换任务。

编辑: 我对另一个日期进行了相同的转换,这是从同一个原始数据文件中获得的。对于这个日期,这没有任何障碍。我由此得出的结论是,当DeliveryDate 包含 NULL 值时可能会出现问题(我不需要对有效的日期使用 COALESCE,因为它始终包含有效的日期类型)。

编辑 2: 我更新了我的 SQL 表 MyNewTable 以不包括 a.DeliveryDate 具有值 NULL 的任何行。然而,这导致了同样的问题。

更新 我注意到,在我转换 yyyymmdd 这个月后我想要的外观实际上是 ISO。因此,我在 CONVERSE 之后添加了一个 CAST,以便获得 SSIS 的合法输入。像这样:

CAST(Convert(nvarchar(15),a.DeliveryDate,112) AS nvarchar(15)) AS DeliveryDate

这会导致我从 SSIS 日期流中的 OLE DB 源导入不会导致错误。但是,在我导出到我的 Datewarehouse 时仍然会出现错误,抱怨数据类型。即使它仍然说在我的数据流的每一步中数据类型都是 DT_WSTR 。

另外,奇怪的是,当我使用表从 OLE DB 导入时,它会导致错误。使用我创建表的相同查询作为导入(使用查询作为输入)不会导致任何问题。

【问题讨论】:

  • 那么,您的目标表的结构是什么?最初创建数据流后,您是否将输出更改为 DT_WSTR?例如您的查询是否首先返回 varchar,然后返回 nvarchar?如果稍后更改源数据类型,SSIS 有时会表现得很糟糕......
  • 我的目标表也有 DT_WSTR。在原始数据库中,它作为 nvarchar 返回,但范围非常大,所以当我在我自己的 SQL 表中转换一些数据类型时,我只是将 nvarchar 调整为 nvarchar(15) 而不是原来的 nvarchar(100 ) 或者。在数据流中的 OLE DB 导入中,我已将受影响的列编辑为具有 DT_WSTR。我后来提交了一个 LOOKUP 函数,当我将 Input 列映射到关于我的 Date 列的输出列时,它不会抱怨。
  • 只是我注意到的另一件事:你应该将你的转换更改为 nvarchar(10) - 否则你会收到一些有趣的形成日期......例如“1900-01-01 00:0”
  • 您可能想尝试的方法是:删除 OLE DB 源并从头开始重新创建它,并在其中进行转换 - 这应该会导致列和所有元数据从一开始就使用 WSTR。 .
  • @Tyron78 谢谢!删除 OLE DB 源并从头开始重新创建它解决了这个问题。我已经在数据类型之间切换了几个小时试图弄清楚,所以它应该包含多个奇怪的值。随时发布您的建议作为答案,以便我接受! :)

标签: sql-server unicode ssis


【解决方案1】:

非 Unicode 字符串数据类型:
将 STR 用于文本文件,将 VARCHAR 用于 SQL Server 列。

Unicode 字符串数据类型:
对文本文件使用 W_STR,对 SQL Server 列使用 NVARCHAR。

问题是您的数据类型不匹配,因此在转换过程中可能会丢失数据。

【讨论】:

  • 我相信我已经这样做了。如果您看到我的查询,那我那里没有问题吗?转换为 nvarchar 的 SQL 查询成功。在我的数据流中导入时,我还将列分配为 DT_WSTR,但它不起作用。
  • 我现在看到你写的是 W_STR 而不是 DT_WSTR 所以我必须在谷歌上搜索一些,看看我是否可以做出任何调整。我的输入字符串在 SQL Server 中具有 Datevalue 值,例如今天日期的字符串显示为“2017-01-26 11:32:15.000”。从谷歌搜索我得出结论,我应该使用 nvarchar 和 DT_WSTR,但也许我最好使用其他转换?
  • 在记事本中打开 ssis 包(dstx 文件)并全局查找和替换 validateExternalMetadata="True" 的所有实例,并使用 validateExternalMetadata="False"。
  • 我无法处理文件,因为我使用的是另一家公司的远程桌面。我不想给其他用户带来问题。
  • 如果您尝试转换为 varchar 而不是 nvarchar 会发生什么?
【解决方案2】:

您可能想尝试:删除 OLE DB 源并使用其中的转换从头开始重新创建它 - 这应该会导致列和所有元数据从一开始就使用 WSTR...

【讨论】:

    【解决方案3】:

    我遇到了类似的问题,并将源更改为 DT_WSTR。虽然,我在源表上遇到错误,它询问我是否要转换回源格式。当我这样做时,源表和目标表的错误都消失了!

    【讨论】:

    • 如果您有兴趣,最好关注该问题,而不是发布显示您处于相同情况的答案。
    猜你喜欢
    • 2016-05-25
    • 2013-07-13
    • 2019-06-26
    • 1970-01-01
    • 2019-01-07
    • 2017-01-02
    • 1970-01-01
    • 2018-08-28
    • 2013-03-10
    相关资源
    最近更新 更多