BIML:有关 varchar > 255 的 ODBC 源列上数据类型处理的问题
BIML: Issues about Datatype-Handling on ODBC-Source Columns with varchar > 255
我刚刚接触 BIML 并编写了一些脚本来创建一些 DTSX 包。一般来说,大多数事情都在起作用。但是有一件事让我抓狂。
我有一个 ODBC 源 (PostgreSQL)。从那里我使用 ODBC 源从 table 中获取数据。 table 有一个文本列(列的名称是“描述”)。我在 ODBC-Source 的查询中将此列转换为 varchar(4000)(我知道会有截断,但没关系)。如果我在 Visual Studio 中手动执行此操作,则 ODBC 源的高级编辑器将显示“Unicode 字符串 [DT_WSTR]”,外部列和输出列的长度均为 4000。所以一切都很好。但是,如果我用 BIML 做同样的事情并生成 SSIS 包,外部列仍会显示长度为 4000 的“Unicode 字符串 [DT_WSTR]”,但输出列会显示“Unicode 文本流[DT_NTEXT]”。因此,BIML 完成的映射不同于 SSIS(手动)完成的映射。这导致了两件事(警告):
- 元数据已更改且应同步的警告
- 以及源使用 LOB-Columns 并通过 Row-Fetch 设置为 Row 的警告..
两个警告都不酷。但是第二个也会导致性能急剧下降!如果我将转换设置为 varchar(255),则映射很好(外部列和输出列然后是“Unicode 字符串 [DT_WSTR]”,长度为 255)。但是一旦我走得更高,就像 varchar(256) 它在输出中再次被视为 [DT_NTEXT]。
我能做些什么吗?我在 BIML 评估中投入了数天时间,发现生活质量有很多提高,但这个问题正在扼杀它。如果我必须在每次构建后手动更正 BIML 的错误,这就违背了 BIML 的目的。
有谁知道我该如何解决这个问题?外部列和输出列之间正确的自动映射会很棒,但至少可以选择自己定义映射。
感谢任何帮助!
问候
马可
编辑 根据要求提供一个最小示例以便更好地理解:
- ODBC 源 (Postegres) 中的列具有“文本”类型(列名:描述)
- 我 select 在 ODBC 源中使用此查询 (DirectInput):
SELECT description::varchar(4000) from mySourceTable
- Biml 中的 ODBC-Source 如下所示:
<OdbcSource Name="mySource" Connection="mySourceConnection"> <DirectInput>SELECT description::varchar(4000) from mySourceTable</DirectInput></OdbcSource>
- 如果我现在生成 dtsx-Package,ODBC-Source 会抛出上述警告以及上述外部和输出列的数据类型
在我从另一个方向得到答案之前的评论中提到:
您必须在 BIML 的 ODBC-Source 中使用 DataflowOverrides。对于我的示例,您必须执行以下操作:
`<OdbcSource Name="mySource" Connection="mySourceConnection">
<DirectInput>SELECT description::varchar(4000) from mySourceTable</DirectInput>
<DataflowOverrides>
<OutputPath OutputPathName="Output">
<Columns>
<Column ColumnName="description" SsisDataTypeOverride="DT_WSTR" DataType="String" Length="4000" />
</Columns>
</OutputPath>
<OutputPath OutputPathName="Error">
<Columns>
<Column ColumnName="description" SsisDataTypeOverride="DT_WSTR" DataType="String" Length="4000" />
</Columns>
</OutputPath>
</DataflowOverrides>
</OdbcSource>`
您不必对所有列进行覆盖,只需对 mapping-Issues 具有的列进行覆盖。
希望这个解决方案可以帮助路过的人。
干杯
我刚刚接触 BIML 并编写了一些脚本来创建一些 DTSX 包。一般来说,大多数事情都在起作用。但是有一件事让我抓狂。
我有一个 ODBC 源 (PostgreSQL)。从那里我使用 ODBC 源从 table 中获取数据。 table 有一个文本列(列的名称是“描述”)。我在 ODBC-Source 的查询中将此列转换为 varchar(4000)(我知道会有截断,但没关系)。如果我在 Visual Studio 中手动执行此操作,则 ODBC 源的高级编辑器将显示“Unicode 字符串 [DT_WSTR]”,外部列和输出列的长度均为 4000。所以一切都很好。但是,如果我用 BIML 做同样的事情并生成 SSIS 包,外部列仍会显示长度为 4000 的“Unicode 字符串 [DT_WSTR]”,但输出列会显示“Unicode 文本流[DT_NTEXT]”。因此,BIML 完成的映射不同于 SSIS(手动)完成的映射。这导致了两件事(警告):
- 元数据已更改且应同步的警告
- 以及源使用 LOB-Columns 并通过 Row-Fetch 设置为 Row 的警告..
两个警告都不酷。但是第二个也会导致性能急剧下降!如果我将转换设置为 varchar(255),则映射很好(外部列和输出列然后是“Unicode 字符串 [DT_WSTR]”,长度为 255)。但是一旦我走得更高,就像 varchar(256) 它在输出中再次被视为 [DT_NTEXT]。
我能做些什么吗?我在 BIML 评估中投入了数天时间,发现生活质量有很多提高,但这个问题正在扼杀它。如果我必须在每次构建后手动更正 BIML 的错误,这就违背了 BIML 的目的。
有谁知道我该如何解决这个问题?外部列和输出列之间正确的自动映射会很棒,但至少可以选择自己定义映射。
感谢任何帮助!
问候 马可
编辑 根据要求提供一个最小示例以便更好地理解:
- ODBC 源 (Postegres) 中的列具有“文本”类型(列名:描述)
- 我 select 在 ODBC 源中使用此查询 (DirectInput):
SELECT description::varchar(4000) from mySourceTable
- Biml 中的 ODBC-Source 如下所示:
<OdbcSource Name="mySource" Connection="mySourceConnection"> <DirectInput>SELECT description::varchar(4000) from mySourceTable</DirectInput></OdbcSource>
- 如果我现在生成 dtsx-Package,ODBC-Source 会抛出上述警告以及上述外部和输出列的数据类型
在我从另一个方向得到答案之前的评论中提到:
您必须在 BIML 的 ODBC-Source 中使用 DataflowOverrides。对于我的示例,您必须执行以下操作:
`<OdbcSource Name="mySource" Connection="mySourceConnection">
<DirectInput>SELECT description::varchar(4000) from mySourceTable</DirectInput>
<DataflowOverrides>
<OutputPath OutputPathName="Output">
<Columns>
<Column ColumnName="description" SsisDataTypeOverride="DT_WSTR" DataType="String" Length="4000" />
</Columns>
</OutputPath>
<OutputPath OutputPathName="Error">
<Columns>
<Column ColumnName="description" SsisDataTypeOverride="DT_WSTR" DataType="String" Length="4000" />
</Columns>
</OutputPath>
</DataflowOverrides>
</OdbcSource>`
您不必对所有列进行覆盖,只需对 mapping-Issues 具有的列进行覆盖。
希望这个解决方案可以帮助路过的人。
干杯