右对齐提取的数字不规则文件列中的值

时间:2011-10-18 23:58:34

标签: sql-server-2008 ssis

我正在使用SQL创建一个“Ragged right”(固定)格式文件来指定要提取的数据。

SELECT 
    'D'                                                             AS DTL_REC_TYP
    ,CAST(CONVERT(VARCHAR, dbo.GetCycleDate(), 120) AS CHAR(10))    AS DTL_FILE_GL_DT
    ,CAST(CONVERT(VARCHAR, GETDATE(), 120) AS CHAR(19))             AS DTL_FILE_CREATE_DT
    ,LEGAL_ENTTY_CD                                                 AS DTL_LEGAL_ENTITY
    ,CLIENT_ID                                                      AS DTL_CLIENT_ID
    ,ACCT_NUM                                                       AS DTL_ACCT_NUM
    ,BEN_OPT_CD                                                     AS DTL_BEN_OPT_CD
FROM
    MyTable 

Client_ID是数据库中的INT列。

问:我如何在列中得到正确的值?

我正在考虑更改我的SQL来执行此操作,但这看起来很难看:

,RIGHT('000000000' + CAST(CLIENT_ID As varchar(9)),9)           AS DTL_CLIENT_ID

,RIGHT('         ' + CAST(CLIENT_ID As varchar(9)),9)           AS DTL_CLIENT_ID

是否有更好的方法在SSIS中执行 而不是T-SQL。如果没有,在T-SQL中有更好的方法吗?在我看来,固定平面文件的格式应该或至少可以在SSIS和SQL中定义。

enter image description here

1 个答案:

答案 0 :(得分:1)

在SQL中进行格式化很难看,但确实有效。

我更喜欢在数据流任务的脚本组件中进行格式化,主要是因为String.Format比T-SQL中的任何东西都强大得多。在这种情况下,脚本将在您选择的DB数据源和平面文件目标之间。

enter image description here

您可以将查询更改为以下内容:

SELECT 
    'D'                 AS DTL_REC_TYP
    ,dbo.GetCycleDate() AS FILE_GL_DT
    ,GETDATE()          AS FILE_CREATE_DT
    ,LEGAL_ENTTY_CD     AS DTL_LEGAL_ENTITY
    ,CLIENT_ID
    ,ACCT_NUM           AS DTL_ACCT_NUM
    ,BEN_OPT_CD         AS DTL_BEN_OPT_CD
FROM
    MyTable 

您不再尝试转换SQL中的数字。查询中的所有列都将成为脚本组件的输入列。对于要格式化的每个列,将输出列添加到脚本组件,其数据类型为DT_WSTR,并且具有适当的宽度。在脚本组件本身中,您只需要向ProcessInputRow事件添加代码:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    Row.DTL_CLIENT_ID = String.Format("{0:000000000}", Row.CLIENT_ID);
    // Do similar formatting for dates, money, whatever
}

然后你的平面文件目标只消耗字符串输出列。