SSIS - 派生列

时间:2013-12-03 22:26:40

标签: sql-server ssis

我遇到使用派生列转换编辑器的问题,并想知道这里是否有人可以帮助我。

我有一个名为WorkitemNumber的列,其中包含INC0000001234

等信息

我想将WorkitemNumber更改为更唯一的数字,以防止在几个月之间重叠输入。所以我提出了这个......

我有一个派生列:

Derived Column Name: ConvertID
Derived Column: <add as new column>
Expression: REPLACE(WorkitemNumber,"INC","") + "913"
Data Type: Unicode string [DT_WSTR]
Length: 258

上面的表达式将INC0000001234更改为0000001234913。我想要做的就是删除所有额外的0,但我想避免使用LTRIM,因为一旦事件报告编号转到下一组数千,它就会中断。

我是使用SSIS的新手,如果有人能够告诉我如何去除最后的额外0,无论事件编号前面的数量是多少,都会非常有用

如果事件编号为1234913INC0000001234,我希望最终输出为INC001234

修改

我能够删除0但是我收到以下错误并且信息没有被写入我的其他表...

[SQL03 [459]] Error: SSIS Error Code DTS_E_OLEDBERROR.  
An OLE DB error has occurred. Error code: 0x80004005.
An OLE DB record is available.  Source: "Microsoft SQL Server Native Client 10.0"  
Hresult: 0x80004005  Description: "Invalid character value for cast specification".

[SQL03 [459]] 
Error: There was an error with input column "ConvertIncidentID" (1015) 
on input "OLE DB Destination Input" (472). 
The column status returned was: "Conversion failed because the data value 
overflowed the specified type.".

[SQL03 [459]] 
Error: SSIS Error Code DTS_E_INDUCEDTRANSFORMFAILUREONERROR.  
The "input "OLE DB Destination Input" (472)" 
failed because error code 0xC020907A occurred, and the error row disposition on 
"input "OLE DB Destination Input" (472)" 
specifies failure on error. An error occurred on the specified object of the 
specified component.  There may be error messages posted before this with more 
information about the failure.

[SSIS.Pipeline] Error: SSIS Error Code DTS_E_PROCESSINPUTFAILED.  
The ProcessInput method on component "SQL03" (459) 
failed with error code 0xC0209029 while processing input "OLE DB Destination Input" 
(472). The identified component returned an error from the ProcessInput method. 
The error is specific to the component, but the error is fatal and will cause the 
Data Flow task to stop running.  There may be error messages posted before this with 
more information about the failure.

1 个答案:

答案 0 :(得分:4)

如果你试图剥离前导零,我会采用这种方法

此表达式从字符串中删除INC

REPLACE(WorkitemNumber,"INC","")

移除INC后,您可以强制转换为数字类型以删除前导零,然后返回字符串以允许您进行连接或其他任何您可能需要执行的操作

(DT_WSTR,10)((DT_I8)REPLACE(WorkitemNumber,"INC",""))

就个人而言,我发现将Derived Columns链接在一起更加用户友好,这样如果它中断,我可以比上面的更容易发现错误。在您的情况下,我使用原始替换生成列,然后使用

(DT_WSTR,10)((DT_I8)WorkItemNoINC)

在我的第二个衍生专栏

enter image description here

修改

再次咬苹果

OLE_SRC查询

我已经定义了以下源查询

SELECT
    'INC0000001234' AS WorkitemNumber
,   CAST(MONTH(D.foo) AS varchar(2)) + RIGHT('0' + CAST(DAY(D.foo) AS varchar(2)), 2) AS fudge
FROM
(
    -- Generate a year's worth of dates
    SELECT 
        DATEADD(d, NUMS.n, '2012-12-31') AS SourceDate
    FROM
    (
        SELECT TOP 366 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS n
        FROM sys.all_columns AS SC
    ) NUMS
) D(foo);

此查询生成366行数据。一个名为WorkItemNumber的常量列和一个名为fudge的列,它将是所有可能的月+日组合。我用0填充了数字,因此值121显然是1月21日而不是12月1日。

DER Drop INC

在这里,我创建了一个名为WorkItemNoINC的新列,并使用表达式

REPLACE(WorkitemNumber,"INC","")

此操作的结果是从源列中删除了文本INC,并替换了替换的空字符串。

DER WorkItemConcat

在此步骤中,我将WorkItemNoINC列与从查询生成的软糖值连接起来。 String + String产生名为WorkItemConcate的字符串(因为我没有校对)

WorkItemNoINC + fudge

DER Strip前导零

在此操作中,我将WorkItemConcate的值转换为bigint并返回字符串以去除前导零。

(DT_WSTR,10)((DT_I8)WorkItemConcate)

运行

我在上次转换后添加了一个数据查看器,您可以看到,对于一年中所有可能的日期和月份值,这些表达式不会出现问题。

enter image description here

让它失败

如果我更新我的源查询以对WorkItemNumber使用NULL,则此包将不会因您遇到而失败。

如果我将WorkItemNumber中的大小写更改为inc,那么我可以生成此错误。

  

错误:DFT Whatevs上的0xC0049064,DER Strip前导零[18]:尝试执行类型转换时发生错误。

     

错误:DFT Whatevs上的0xC0209029,DER Strip前导零[18]:SSIS错误代码DTS_E_INDUCEDTRANSFORMFAILUREONERROR。 “DER Strip前导零”失败,因为发生错误代码0xC0049064,并且“DER条带前导零。输出[派生列输出] .Columns [派生列1]”上的错误行处置指定错误失败。指定组件的指定对象发生错误。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

     

错误:DFT Whatevs上的0xC0047022,SSIS.Pipeline:SSIS错误代码DTS_E_PROCESSINPUTFAILED。组件“DER Strip leading zeros”(18)上的ProcessInput方法在处理输入“Derived Column Input”(19)时失败,错误代码为0xC0209029。标识的组件从ProcessInput方法返回错误。该错误特定于组件,但错误是致命的,将导致数据流任务停止运行。在此之前可能会发布错误消息,其中包含有关失败的更多信息。

与您相似但不一样。我没有一个2008实例可以测试,但尝试在多个派生列转换中分解您的操作,并根据需要添加数据查看器。