我正在创建一个select语句,因为列名和表名可以更改,但它们都需要进入相同的数据目标。还有其他共性使这个可行,如果我需要以后我会进入它们。因此,它归结为:我创建了包含16列的select语句,总会有16列,不多也不少,列名可以更改,表名可以更改。当我执行包时,select语句很好地构建,但是当数据流尝试执行时,我收到以下错误:
需要从外部元数据列集中删除“外部元数据列”ColumnName“(79)”。
生成的实际SQL语句是:
select 0 as ColumnName, Column88 as CN1, 0 as CN2, 0 as CN3, 0 as CN4,
0 as CN5, 0 as CN6, 0 as CN7, 0 as CN8, 0 as CN9, 0 as CN10,
0 as CN11, 0 as CN12, 0 as CN13, 0 as CN14, 0 as CN15 from Table3
动态生成“Column88”列,表名也是如此。如果其他'作为CNx'列的源列存在,它们将以相同的方式出现(Column88为CN1,Column89为CN2,Column90为CN3等),表名将始终采用以下形式:Tablex其中x为一个整数。
有人可以帮我解决错误以及如何解决问题吗?
答案 0 :(得分:4)
你在这里很深。您应该将其视为已读取,您无法更改明显的列名称或类型。输入列的名称和类型成为从源流下来的元数据的名称和类型。如果你改变它们,那么依赖它们的一切都必须失败。
解决方案是通过使用列别名和强制转换来安排这些是稳定的。一张桌子:
SELECT COLNV, COLINT FROM TABLE1
换另一个
SELECT CAST(COLV AS NVARCHAR(50)) AS COLNV, CAST(COLSMALL AS INTEGER) AS COLINT FROM TABLE2
尝试一下,看看它是否适合您。如果不修复整个软件包的剩余部分,您实际上无法更改元数据。
答案 1 :(得分:0)
当我不得不在SQL中从存储过程中删除一个列(向临时表吐出)并添加两列时,我遇到了同样的问题。为了解决这个问题,我必须从头开始查看我的SSIS包的每个部分(来源 - 在我的情况下,从临时表拉出),一直到你的目的地(在我的情况下,平面文件连接到一个公寓)文件csv)。我不得不重新做一路上的所有映射,我在SSIS的GUI数据流任务中观察到错误。
这个错误确实以红色X的形式出现,周围有一个圆圈,我徘徊,它提到了元数据的东西......我双击它,它警告我,我的一个列没有不再存在,想知道我是否想删除它。我确实删除了它,但我可以告诉你,这个错误更多地与SSIS有关,告诉你你的映射是关闭的,你需要遍历你的SSIS包的每个部分,以确保所有内容都被正确映射出来。
答案 2 :(得分:0)
如何在桌面前使用视图。并将视图作为SSIS源调用。这样,您可以根据需要映射列,并使用ISNULL
或COALESCE
函数来保持一致的列模式。