我已经设置了一个SSIS解决方案,我使用SQL Server导入原始数据'并将这些转换为合适的数据类型并将它们保存到表中。对于列我有问题,我这样做(注意我只想要日期,而不是时间值,这就是我使用112
作为参数的原因):
SELECT CONVERT(nvarchar(15),a.DeliveryDate,112) AS DeliveryDate
INTO MyNewTable
FROM MyRawDataTable
然后我使用MyNewTable
作为Visual Basic中SSIS的输入。在数据流中,我右键单击我的源OLE DB,并确保DT_WSTR
和15
下的数据类型实际为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导入时会导致错误。使用相同的查询我创建我的表作为导入(使用查询作为输入)不会导致任何问题。
答案 0 :(得分:2)
您可能想尝试:删除OLE DB源并从头开始重新创建它的转换 - 这应该导致列和所有元数据从头开始使用WSTR ...
答案 1 :(得分:0)
非Unicode字符串数据类型:
将STR用于文本文件,将VARCHAR用于SQL Server列。
Unicode字符串数据类型:
将W_STR用于文本文件,将NVARCHAR用于SQL Server列。
问题是您的数据类型不匹配,因此转换过程中可能会丢失数据。
答案 2 :(得分:0)
我遇到了类似的问题,并将源更改为DT_WSTR。虽然,我在源表上遇到错误,它询问我是否要转换回源格式。当我这样做时,源表和目标表的错误都消失了!