我正在使用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中定义。
答案 0 :(得分:1)
在SQL中进行格式化很难看,但确实有效。
我更喜欢在数据流任务的脚本组件中进行格式化,主要是因为String.Format比T-SQL中的任何东西都强大得多。在这种情况下,脚本将在您选择的DB数据源和平面文件目标之间。
您可以将查询更改为以下内容:
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
}
然后你的平面文件目标只消耗字符串输出列。