3

我正在尝试使用 SSIS 中的数据流将 SSAS DMV 元数据导入 SQL Server。在此示例中,我尝试从 $SYSTEM.TMSCHEMA_PARTITIONS DMV 导入数据。我的选择语句(看起来像 SQL 但不是 SQL)是:

SELECT
[ID]
,[TableID]
,[Name]
,[Description]
,[DataSourceID]
,[QueryDefinition]
,[State]
,[Type]
,[PartitionStorageID]
,[Mode]
,[DataView]
,[ModifiedTime]
,[RefreshedTime]
,[SystemFlags]
,[ErrorMessage]
FROM $SYSTEM.TMSCHEMA_PARTITIONS

QueryDefinition 列包含具有数千个字符的记录。但是,SSIS 数据源组件的 ExternalColumns 部分将列识别为长度为 255 的 DT_WSTR。无法更改外部列数据类型,因为它会不断恢复。根据 MS 文档,也不能在 DMV 选择语句中使用 CAST 或 CONVERT:

DMV 的查询引擎是数据挖掘解析器。DMV 查询语法基于 SELECT (DMX) 语句。尽管 DMV 查询语法基于 SQL SELECT 语句,但它不支持 SELECT 语句的完整语法。值得注意的是,不支持 JOIN、GROUP BY、LIKE、CAST 和 CONVERT。

自然,我遇到了截断错误。我的问题是,有没有办法改变 SSIS 解释 SSAS DMV 元数据数据类型的方式?

我尝试使用 order by (作为测试)首先返回字符串长度> 255 的记录,以迫使 SSIS 直接思考。这无济于事。

4

1 回答 1

0

尝试使用除该列之外的所有列添加查询QueryDefinition,然后通过以下步骤定义该列。通过此操作,我能够将 OLE DB 源组件上的外部列和输出列的数据类型设置为 DT_WSTR,长度为 4000。

  • 将连接管理器定义为具有 Native OLE DB\Microsoft OLE DB Provider for Analysis Services 13.0 提供程序类型的 OLE DB 连接。
  • 在数据流任务中,添加一个包含除该列之外的所有列的 OLE DB 源组件,QueryDefinition并确保其他列的数据类型设置正确。
  • ValidateExternalMetadata在此之后,在 OLE DB 源上设置为 False。
  • 打开 OLE DB 源的高级编辑器(右键单击,然后显示高级编辑器...)。在“组件属性”页面的字段中添加QueryDefinition列。SqlCommand
  • 在 Input and Output Properties 页面上,转到 OLE DB Source Output 下的 External Columns 文件夹,按 Add Column 按钮,然后添加QueryDefinition具有正确数据类型和更长长度的列。记下ID该列字段中的值。
  • 在 Output Columns 文件夹中,QueryDefinition再次添加具有相同数据类型和长度的列。在该ExternalMetadataColumnID字段中,输入该列ID在“外部列”文件夹中的字段中具有的相同值,以将它们映射在一起。
于 2019-01-08T14:35:24.847 回答