Работа с данными фиксированной ширины:
Данные в текстовом файле или строке фиксированной ширины располагаются в строках и столбцах, по одной записи на строку.Каждый столбец имеет фиксированную ширину, указанную в символах, которая определяет максимальный объем данных, которые он может содержать.Разделители не используются для разделения полей в файле.
При анализе этих данных в T-SQL вы можете использовать SUBSTRING
https://docs.microsoft.com/en-us/sql/t-sql/functions/substring-transact-sql?view=sql-server-2017
SUBSTRING ( expression ,start , length )
Вот пример:
DECLARE @SampleData TABLE
(
[LineData] NVARCHAR(255)
);
INSERT INTO @SampleData (
[LineData]
)
VALUES ( '1001RJOHNKEITH25 20181017 NA' )
, ( '1002CDWANEKANE36 20181010 RR' )
, ( '1003CMIKAYLAGN44 20181011 RR' );
SELECT SUBSTRING([LineData], 1, 4) AS [PersonId]
, SUBSTRING([LineData], 5, 1) AS [Indicator]
, SUBSTRING([LineData], 6, 9) AS [Name]
, SUBSTRING([LineData], 15, 2) AS [Age]
, SUBSTRING([LineData], 18, 8) AS [RegDate]
, SUBSTRING([LineData], 27, 2) AS [RecordType]
, *
FROM @SampleData;
Итак, в вашем примере вы хотите оценить, является ли «Индикатор» «R», вы можете получить это значение с помощью:
SUBSTRING([LineData], 5, 1)
Не уверен, как это вписывается в то, что вам поручено.Основываясь на других комментариях, есть еще один способ определения этого «индикатора».
Не идеально, но вы можете разобрать все поля и затем собрать их вместе, выполняя оценку в этом поле индикатора или использовать материал воператор case для замены даты пробелами при оценке, если в строке указан индикатор R.
DECLARE @SampleData TABLE
(
[LineData] NVARCHAR(255)
);
INSERT INTO @SampleData (
[LineData]
)
VALUES ( '1001RJOHNKEITH25 20181017 NA' )
, ( '1002CDWANEKANE36 20181010 RR' )
, ( '1003CMIKAYLAGN44 20181011 RR' );
--We check for R using substring
--when not equal to R we replace where Registration date in the string was with blanks.
SELECT CASE WHEN SUBSTRING([LineData], 5, 1) = 'R' THEN [LineData]
ELSE STUFF([LineData], 18, 8, ' ')
END AS [LineData]
FROM @SampleData;