Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Парсинг csv в T-SQL.  [new]
Oleon
Member

Откуда:
Сообщений: 348
Есть varchar(max) переменная, в которой хранится csv файл с большим количеством колонок и строк.
Как оптимальнее превратить ее в таблицу?

Я вижу вариант такой - сохранить в файл, а потом OPENWORSET считать данные из этого файла.

А может быть можно без сохранения в файл обойтись?

Спасибо!
29 ноя 18, 15:12    [21748707]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 1995
Oleon,
поиск "for xml path"

выгрузить из базы, чтобы загрузить в базу это сильно))
29 ноя 18, 15:18    [21748716]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5671
StarikNavy
Oleon,
поиск "for xml path"

выгрузить из базы, чтобы загрузить в базу это сильно))

и посмотреть как всё будет тошнить "файл с большим количеством колонок и строк. "
29 ноя 18, 15:21    [21748720]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
L_argo
Member

Откуда:
Сообщений: 445
StarikNavy
Oleon,
поиск "for xml path"

выгрузить из базы, чтобы загрузить в базу это сильно))
А что смешного ? А если базы разные ?
29 ноя 18, 15:48    [21748779]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
aleks222
Member

Откуда:
Сообщений: 339
StarikNavy
Oleon,
поиск "for xml path"

выгрузить из базы, чтобы загрузить в базу это сильно))


Зато быстро.
Особенно, если реально большой.
29 ноя 18, 15:55    [21748788]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
Oleon
Member

Откуда:
Сообщений: 348
Есть процедура, которая по ссылка загружает csv файл в переменную, нужно сделать из нее select. В базе пока ничего нет, наоборот, хочу сохранить, только нужные поля.

declare @Result varchar(max)
exec fxcDW.dbo.Http_GetData
@url = 'https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key=1XIJG8AqMYpsoNJQYZNkGvffndjqFb4G0MM6G-U-tJR8&gid=1196739388&exportFormat=csv',
@Result = @Result out

По строкам могу разбить, сделав string_split, но дальше, еще каждую строку нужно разбить на колонки.
вот тут не моогу придумать.
29 ноя 18, 15:58    [21748792]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 1995
Oleon
строку нужно разбить на колонки.
.

substring
29 ноя 18, 16:19    [21748831]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5977
Oleon,

хорошо еще раз подумайте и не превращайте сервер баз данных в сервер приложений. Не, ну им орехи еще можно колоть, чё.
Для загрузки и импорта существуют другие средства, например Integration Services.
29 ноя 18, 16:52    [21748880]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
court
Member

Откуда:
Сообщений: 1530
declare @sql varchar(max)=''
declare @sql1 varchar(max)=''
declare @sql2 varchar(max)=''
declare @txt varchar(max)=
'col1,col2,col3
1,vova,3
4,petya,6
7,8,9'

---
;with cte as (
	select 
		rn	=row_number()over(order by (select 1))
		,r	=value
	from string_split(@txt,char(10))
)
select 
	@sql1=case when rn>1 then @sql1+case when @sql1='' then '' else ' union all ' end+'select '''+replace(cte.r,',',''',''')+'''' else '' end
	,@sql2=@sql2+case when rn=1 then cte.r else '' end 
from cte

--
set @sql = ';with cte('+@sql2+') as ('+@sql1+') select * from cte'
exec(@sql)

col1col2col3
1vova3
4petya6
789
29 ноя 18, 16:59    [21748884]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
Oleon
Member

Откуда:
Сообщений: 348
Небольшой опыт использования пакетов в сравнении с процедурами, говорит о том, что так проще вносить изменения и исправлять баги. Да и по времени получается быстрее и в тестировании. Если нет каких-то больших требований к скорости. то думаю, можно было бы и в процедуре все сделать.

;with cte as (
	select value, row_number() over(order by (select 1)) as rownum from string_split(@Result, char(10))
), 

cte_col_number as (
SELECT b.*, a.rownum as row_num
FROM   cte a
       cross apply (select value, row_number() over (order by (select 1)) as rownum from string_split(a.value,','))  b
) 

select 
	max(case when rownum = 1 then value else null end) as col1,
	max(case when rownum = 2 then value else null end) as col2, 
	max(case when rownum = 3 then value else null end) as col3,
	max(case when rownum = 3 then value else null end) as col4,
	max(case when rownum = 3 then value else null end) as col5,
	max(case when rownum = 3 then value else null end) as col6
from 
	 cte_col_number a 
where row_num > 1 
group by a.row_num


правда, не пробовал 2.5 мегабайта так развернуть:)
29 ноя 18, 17:47    [21748923]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
Oleon
Member

Откуда:
Сообщений: 348
court - row_number()over(order by (select 1)) - вот это интересный ход.
29 ноя 18, 18:03    [21748949]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 5671
Oleon
court - row_number()over(order by (select 1)) - вот это интересный ход.

row_number()over(order by 1/0)
29 ноя 18, 18:05    [21748951]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
Oleon
Member

Откуда:
Сообщений: 348
Это еще интереснее:)
29 ноя 18, 18:43    [21749001]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
andrey odegov
Member

Откуда:
Сообщений: 441
еще может встретиться ORDER BY (SELECT NULL).
30 ноя 18, 05:31    [21749309]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
tunknown
Member

Откуда:
Сообщений: 577
Владислав Колосов
не превращайте сервер баз данных в сервер приложений.
SQL Server- есть сервер приложений, разрабатываемых на языке Transact-SQL. Поэтому, его нельзя превратить.
30 ноя 18, 09:39    [21749425]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5977
tunknown,

cool story, но эта парадигма работает лишь для small office home office применений.
30 ноя 18, 11:14    [21749648]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
Cammomile
Member

Откуда:
Сообщений: 1196
Oleon,

https://www.sql.ru/forum/1261269/csv-v-tablicu?hl=csvtotable
30 ноя 18, 11:21    [21749669]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 27428
Владислав Колосов
tunknown,

cool story, но эта парадигма работает лишь для small office home office применений.
Для импорта использовать не средства импорта, а сервер приложений, к тому же называть SSIS сервером приложений тоже странная парадигма.

К тому же ТС решает задачу преобразования данных, из полей одной таблицы, в поля другой таблицы; для этого, конечено, нужно использовать серверы приложений, никак не СУБД?

И вообще, парадигмы ентерпрайз/хоум оффис применений заключаются никак не в формальном количестве уровней, это нечто другое. Может быть масштабное, настоящее приложение для крупного бизнеса, сделанное как прога обработчик текстовых файлах, и приложение, тянущее только на хоум офис, при этом сделанное как многоуровневое распределённое решение на джаве, но приименять его в крупном бизнесе будет нельзя.
30 ноя 18, 14:18    [21750010]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5977
alexeyvg,

почему Вы называете "средствами импорта" Unsafe CLR процедуру, выполняющую запросы к сторонним веб-ресурсам? Так можно и утку журавлём назвать. Более, чем на small системах с 2-3 многостаночниками такие "интеграции" приведут к заметным проблемам при эволюционной разработке и проблемам в сопровождении кода. Например, если будет принято решение получать данные из других источников. Такие решение относят к технологиям с сильной связностью со всеми вытекающими.
30 ноя 18, 17:49    [21750534]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 965
BCP
3 волшебные буквы
и поиск по ним.
30 ноя 18, 20:03    [21750732]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг csv в T-SQL.  [new]
PizzaPizza
Member

Откуда:
Сообщений: 146
Oleon
Есть процедура, которая по ссылка загружает csv файл в переменную, нужно сделать из нее select.


А доступа к процедуре у вас нет? Гораздо проще было бы bulk insert аж временную таблицу и уже развлекаться как вам удобно.
30 ноя 18, 20:33    [21750755]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить