2015-12-07 2 views
0

В настоящее время моя запись такова, как показано ниже. Одна полная запись разделяется по трубе |, а данные разделяются запятой.MSSQL 2012 Разделение записей в несколько строк

123,870503-23-5370,021|456,830503-23-5371,031|789,870103-11-5372,041|654,870501-23-5373,051|321,880503-12-5374,061|987,870803-23-5375,071|109,870508-06-5376,081|174,810503-03-5377,091|509,870103-01-5378,101|687,870501-12-5379,131 

Как разделить запись стать:

C1 C2    C3   
123 870503-23-5370 021 
456 830503-23-5371 031 
789 870103-11-5372 041 
...... 

ответ

3

Этот вид операции должно быть сделано в прикладном уровне.

Быстрый обходной uisng XML, чтобы разделить на основе |:

declare @S varchar(1000) = '123,870503-23-5370,021|456,830503-23-5371,031|789,870103-11-5372,041|654,870501-23-5373,051|321,880503-12-5374,061|987,870803-23-5375,071|109,870508-06-5376,081|174,810503-03-5377,091|509,870103-01-5378,101|687,870501-12-5379,131' 

Spliting для каждого столбца с помощью PARSENAME:

;WITH cte AS 
(
select 
REPLACE(n.r.value('.', 'varchar(500)'), ',','.') As c 
from (select cast('<r>'+replace(@S, '|', '</r><r>')+'</r>' as xml)) as s(XMLCol) 
    cross apply s.XMLCol.nodes('r') as n(r) 
) 
SELECT PARSENAME(c,3) AS col1, 
     PARSENAME(c,2) AS col2, 
     PARSENAME(c,1) AS col3 
FROM cte; 

LiveDemo

Выход:

╔══════╦════════════════╦══════╗ 
║ col1 ║  col2  ║ col3 ║ 
╠══════╬════════════════╬══════╣ 
║ 123 ║ 870503-23-5370 ║ 021 ║ 
║ 456 ║ 830503-23-5371 ║ 031 ║ 
║ 789 ║ 870103-11-5372 ║ 041 ║ 
║ 654 ║ 870501-23-5373 ║ 051 ║ 
║ 321 ║ 880503-12-5374 ║ 061 ║ 
║ 987 ║ 870803-23-5375 ║ 071 ║ 
║ 109 ║ 870508-06-5376 ║ 081 ║ 
║ 174 ║ 810503-03-5377 ║ 091 ║ 
║ 509 ║ 870103-01-5378 ║ 101 ║ 
║ 687 ║ 870501-12-5379 ║ 131 ║ 
╚══════╩════════════════╩══════╝ 

Предупреждение:

Использование XML может вызвать проблемы, когда ваша строка содержит некоторые символы, такие как <&'">.

PARSENAME Используется для быстрого разделения до 4 ломтиков. Работает только с данными, которые не содержат символ ..

EDIT:

Установка очень проста:

;WITH cte AS 
(
select 
REPLACE(n.r.value('.', 'varchar(500)'), ',','.') As c 
from (select cast('<r>'+replace(@S, '|', '</r><r>')+'</r>' as xml)) as s(XMLCol) 
    cross apply s.XMLCol.nodes('r') as n(r) 
) 
INSERT INTO your_table(col1, col2, col3) 
SELECT PARSENAME(c,3) AS col1, 
     PARSENAME(c,2) AS col2, 
     PARSENAME(c,1) AS col3 
FROM cte; 
+0

Первое ограничение может быть выполнено с использованием метода «Значение» –

+0

Спасибо, lad2025 за быстрый ответ. Ваш скрипт работает. Можете ли вы расширить, чтобы я мог вставить результаты в базу данных. – SiChiPan

+0

@SiChiPan использовать [INSERT] (https://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=EN-US&k=k (INSERT_TSQL); k (SQL11.SWB.TSQLRESULTS.F1); k (SQL11.SWB.TSQLQUERY.F1); k (MISCELLANEOUSFILESPROJECT); k (DevLang-TSQL) & rd = true) для этого –

1

Другой метод может быть просто экспортировать данные в файл CSV (вы можете легко сделать это с помощью студии управления), а затем нагрузка этот csv-файл с использованием BULK INSERT путем указания разделителей полей и записей. Подробное объяснение того, как это сделать, можно найти здесь: bulk insert csv

Смежные вопросы