【问题标题】:How to transfer data using SSIS when database columns are defined as VARCHAR(MAX)?当数据库列定义为 VARCHAR(MAX) 时如何使用 SSIS 传输数据?
【发布时间】:2013-02-05 10:44:41
【问题描述】:

我在执行包时收到以下消息。

文本被截断或目标代码页中的一个或多个字符不匹配。

我从一个 SQL 表中获取数据,该表的字段名称为 task_teammember,数据类型为 VARCHAR(MAX)。包执行在源头失败。我将列 task_teammber 输入到 VARCHAR(8000) 中,它执行包而没有任何错误消息。但是,目标仅接收 8000 个字符,而源表中有超过 8000 个字符。

当列定义为VARCHAR(MAX)时,如何使用 SSIS 将所有数据从源表传输到目标表?

【问题讨论】:

标签: ssis


【解决方案1】:

您需要使用 SSIS 数据类型 text stream [DT_TEXT] 从数据类型为 varchar(MAX)

的 SQL Server 表列中获取数据

这是一个简单的示例,说明 SSIS 如何自动从源推断数据类型。该示例使用 SQL Server 2008 R2 数据库和 SSIS 2008 R2

在 SQL Server 数据库中创建以下表来存储源文本并使用目标通过 SSIS 包插入文本。

CREATE TABLE [dbo].[SourceTable](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [SourceText] [varchar](max) NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[DestinationTable](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [DestinationText] [varchar](max) NOT NULL
) ON [PRIMARY]

将大长度的文本插入源表。执行打包前可以看到源表中的数据超过10000个字符,目的表为空。

创建一个带有数据库连接管理器的 SSIS 包。在控制流任务上放置一个数据流任务。在数据流任务中,放置一个 OLE DB 源和 OLE DB 目标以将数据从 dbo.SourceTable 传输到 dbo.DestinationTable。这里的截图显示了包的执行状态。

如果再次运行查询,您将看到目标表使用 SSIS 包填充了源表中的文本,没有任何截断错误。

返回包的数据流任务选项卡并右键单击OLE DB Source,然后单击Show Advanced Editor...

Advanced Editor for OLE DB Source 上,单击输入和输出属性选项卡。展开 External Columns 并选择 SourceText。您会注意到,SSIS 根据源表上定义的数据类型VARCHAR(MAX) 将列数据类型设置为文本stream [DT_TEXT]

以下是 SSIS 中 SQL Server 数据类型 VARCHAR(MAX) 和 NVARCHAR(MAX) 的映射。

VARCHAR(MAX) ---> 文本流 [DT_TEXT]

NVARCHAR(MAX) ---> Unicode 文本流 [DT_NTEXT]

MSDN Integration Services Data Types

上了解更多信息

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多