无法在SSIS

时间:2017-01-26 08:26:50

标签: sql-server unicode ssis

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

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

然后我使用MyNewTable作为Visual Basic中SSIS的输入。在数据流中,我右键单击我的源OLE DB,并确保DT_WSTR15下的数据类型实际为Advanced Options,长度为Input 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。我注意到我的输出中仍然有DT_WSTR长度15来自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导入时会导致错误。使用相同的查询我创建我的表作为导入(使用查询作为输入)不会导致任何问题。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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