Правое выравнивание значения в извлеченном числовом столбце рваного файла - PullRequest
0 голосов
/ 19 октября 2011

Я создаю файл формата «Ragged right» (фиксированный), используя SQL для указания данных для извлечения.

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 Ответ

1 голос
/ 19 октября 2011

Выполнение форматирования в SQL некрасиво, но оно работает.

Я предпочитаю выполнять форматирование в компоненте Script задачи потока данных, главным образом потому, что String.Format намного мощнее, чем что-либоT-SQL.В этом случае сценарий будет проходить между выбранным источником данных БД и местом назначения плоского файла.

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
}

Тогда ваше назначение для плоского файла просто использует строковые столбцы вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...