【问题标题】:Why are my CASTS seemingly ignored in SSIS?为什么我的 CASTS 在 SSIS 中似乎被忽略了?
【发布时间】:2013-02-27 20:29:30
【问题描述】:

我在 SSIS 中使用 数据流任务 将数据从一台服务器 (SQL Server 2005) 获取到另一台服务器 (SQL Server 2008 R2)。在 OLE DB Source 连接中,我使用 SQL 命令来获取数据。在这个命令中,我已经将内容转换为某种数据类型:

SELECT
CAST(column1 AS VARCHAR(10)) AS NameColumn1
,CAST(column2 AS INT) AS NameColumn2
,CAST(REPLACE(REPLACE(REPLACE(REPLACE(column3, CHAR(10), ''), CHAR(13), ''), CHAR(9), ''), ';', '-') AS VARCHAR(100)) AS NameColumn3
,CAST(REPLACE(REPLACE(REPLACE(REPLACE(column4, CHAR(10), ''), CHAR(13), ''), CHAR(9), ''), ';', '-') AS VARCHAR(255)) AS NameColumn4
...
FROM (etc.)

(请注意,转换是转换为源数据库中列值的原始数据类型。因此column1的数据类型最初是VARCHAR(10),column4的数据类型最初是VARCHAR(255),等等。)

之所以使用这些强制转换,是因为在包的后面,我收到了column3column4 的以下警告:

验证警告。 [...]由于插入数据可能会发生截断 从长度为8000的数据流列“column4”到数据库 列“column4”,长度为 255。

看起来好像强制转换不起作用,因为 column3 和 column4 的截断警告不断出现。 (我已经将 OLE DB 源 中的截断警告设置为 Ignore failure,但这似乎没有什么区别。)

我在网上找不到任何内容,暂时将通过将列导入为VARCHAR(8000) 来“解决”这个问题。但我很想知道 SSIS 中这种行为的原因是什么。有人知道吗?

【问题讨论】:

  • ru 使用任何 derived column 从而将其长度转换为 8000,因为错误清楚地指出 column4source table 中的长度为 8000 并且您正在尝试映射到destination 中具有 255 长度的列?
  • 否,因为column4 是源表中的数据类型VARCHAR(255)。这8000的长度似乎是凭空而来的……
  • Right click 在OLEDB源上并手动更改第4列的长度,以防万一检查DestinationSource中的属性ValidateExternalMetadata。它应该是true跨度>
  • 如果您将 CAST 更改为 CAST,例如 Varchar(10)。这会改变错误信息吗? (在这种情况下,截断警告是由强制转换引起的,而 40000 只是中间列获得的 SSIS 最大大小)

标签: sql-server-2005 ssis sql-server-2008-r2 truncation


【解决方案1】:

进入源组件的高级属性并验证第 3 列和第 4 列的大小(在输入和输出属性中)。如果它们已经被计算为 varchar(8000) 那么您将不得不手动更改它们。

或者,删除组件并添加一个新组件,从一开始就使用您的 Select / Cast - 这应该正确分配正确的字段长度。

【讨论】:

  • 作为删除组件的替代方法,只需将查询更改为SELECT 1 as tmp 之类的内容。单击确定后,输出缓冲区的元数据将重置为数据类型为 int 的单个列。然后将您的查询粘贴回去。根本问题是源组件并不总是关心源列是否小于最初声明的。逻辑似乎是“字符串 255 适合字符串 8000,因此无需刷新元数据。”
  • @billinkc:你的建议成功了!显然问题是由于元数据没有被刷新......感谢您的建议!今天学到了一些新东西:-)
猜你喜欢
  • 1970-01-01
  • 2021-09-09
  • 2021-10-28
  • 2016-09-30
  • 2012-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多