Как вам уже сказали, T- SQL не является подходящим инструментом для этого ...
Способности манипуляции со строками довольно слабые, но вы можете попробовать один из следующих маршрутов:
Я начинаю симулировать с переменной, содержащей содержимое вашего текстового файла.
DECLARE @YourFile VARCHAR(MAX)=
'A|B|C|D|E
01|1|1|1|1
02|2|2|2|2';
- объявлять переменные для разрыва строки и разделителя
DECLARE @YourLineBreak VARCHAR(2)=CHAR(13)+CHAR(10); --might differ...
DECLARE @YourDelimiter VARCHAR(1)='|';
- Этот запрос будет преобразовать ваш файл в XML
DECLARE @YourInput XML=
CAST(CONCAT('<line><val>'
,REPLACE(REPLACE(@YourFile,@YourDelimiter,'</val><val>'),@YourLineBreak,'</val></line><line><val>')
,'</val></line>') AS XML);
SELECT @YourInput;
- этот запрос вернет имена столбцов
SELECT A.cols.value('text()[1]','varchar(max)') AS ColumnName
FROM @YourInput.nodes('/line[1]/*') A(cols) ;
- этот запрос вернет каждую строку данных в виде одной строки
WITH CountRows(LineIndex) AS(SELECT TOP((SELECT @YourInput.value('count(/line)','int')-1)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values)
SELECT LineIndex
,@YourInput.query('/line[sql:column("LineIndex")+1]') AS LineValues
FROM CountRows;
- В этом запросе я сначала вводит последовательность чисел, которую можно использовать в XQuery позже
WITH InjectSequence(Combined) AS
(
SELECT (SELECT TOP((SELECT @YourInput.value('count(/line[1]/val)','int'))) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) FROM master..spt_values FOR XML PATH('Nmbr'),TYPE)
,@YourInput
FOR XML PATH(''),TYPE
)
SELECT Combined.query
('
let $cols := /line[1]/val
for $ln in /line[position()>1]
return
<line>
{
for $nr in /Nmbr/text()
let $n := xs:int($nr)
return
<val name="{$cols[$n]}" value="{$ln/val[$n]}" />
}
</line>
')
FROM InjectSequence;
Какой бы подход вы ни выбрали, вам придется если вы выполняете ручную работу, очень много.
Конечный запрос должен быть либо динамически создан, либо вы можете остаться в универсальных c контейнерах, таких как XML или JSON.
С SQL -Server 2016 есть JSON
С v2016 + вы можете попробовать JSON маршрут тоже:
SELECT B.*
FROM OPENJSON(CONCAT('[',STUFF(CONCAT(',[["',REPLACE(REPLACE(@YourFile,@YourDelimiter,'","'),@YourLineBreak,'"],["'),'"]]'),1,1,''),']')) A
CROSS APPLY OPENJSON(A.[value])
WITH(col1 VARCHAR(MAX) '$[0]'
,col2 VARCHAR(MAX) '$[1]'
,col3 VARCHAR(MAX) '$[2]'
,col4 VARCHAR(MAX) '$[3]'
,col5 VARCHAR(MAX) '$[4]') B --add as many as you need
Удачи!