SSIS用户定义的类型

时间:2012-08-30 23:28:21

标签: sql sql-server-2005 ssis data-conversion

我们正在尝试使用SSIS包从平面文件将数据导入我们的SQL 2005数据库。

我们的数据库有一个用于保存一些相关信息的CLR用户定义类型,我们称之为dbo.CustomType。

要在SQL中创建dbo.CustomType的对象,我可以执行以下操作:

DECLARE @Decimal1   DECIMAL(18,6),
        @Int1       INT,
        @Decimal2   DECIMAL(18,6),
        @Int2       INT,
        @Decimal3   DECIMAL(18,6)


SELECT  @Decimal1   = 1.5,
        @Int1       = 1,
        @Decimal2   = 2.5,
        @Int2       = 2,
        @Decimal3   = 3



SELECT 
    CONVERT(
                dbo.CustomType,
                CONVERT(VARCHAR(20), @Decimal1) + ';' + 
                CONVERT(VARCHAR(20), @Decimal2) + ':' +
                CONVERT(VARCHAR(2), @Int1) + ';' +
                CONVERT(VARCHAR(20), @Decimal3) + ':' +
                CONVERT(VARCHAR(2),  @Int2)
            )

在SSIS中,我有一个数据集,其中所有列都由变量表示,但我如何组合它们并将它们转换为dbo.CustomType?

====

更新:

在OLE DB Command对象中使用insert语句而不是OLE DB Destination时,我能够插入自定义类型。

SO:

INSERT INTO Greg
VALUES (CONVERT(dbo.CustomType, '1;1:1;1:1;'))

有效,但

INSERT INTO Greg
VALUES (Convert(dbo.Customtype, ?))

给出错误

[OLE DB命令[3103]]错误:SSIS错误代码DTS_E_OLEDBERROR。发生OLE DB错误。错误代码:0x80040E21。 OLE DB记录可用。来源:“Microsoft SQL Server Native Client 10.0”Hresult:0x80040E21描述:“转换规范的字符值无效”。

似乎是在尝试将我的字符串列转换为字节流,但每当我尝试在高级编辑器中将Param_0更改为String时,它会不断更改回字节流

1 个答案:

答案 0 :(得分:2)

您可以分两步尝试:

  1. 在数据流任务中将此数据插入到停滞表中以分隔列
  2. 然后在执行SQL任务中,使用convert
  3. 将数据从交错的表插入到目标

    示例:

    insert into DestinationTable
    select convert(dbo.Customtype, DecimalColumn1, DecimalColumn2, IntColumn1, DecimalColumn3, IntColumn2)
    from StaggingTable