【发布时间】: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 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。我注意到我的输出中仍然有长度为15 的DT_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