Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Парсинг csv в T-SQL. / 23 сообщений из 23, страница 1 из 1
29.11.2018, 15:12
    #39740403
Oleon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
Есть varchar(max) переменная, в которой хранится csv файл с большим количеством колонок и строк.
Как оптимальнее превратить ее в таблицу?

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

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

Спасибо!
...
Рейтинг: 0 / 0
29.11.2018, 15:18
    #39740406
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
Oleon,
поиск "for xml path"

выгрузить из базы, чтобы загрузить в базу это сильно))
...
Рейтинг: 0 / 0
29.11.2018, 15:21
    #39740407
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
StarikNavyOleon,
поиск "for xml path"

выгрузить из базы, чтобы загрузить в базу это сильно))
и посмотреть как всё будет тошнить "файл с большим количеством колонок и строк. "
...
Рейтинг: 0 / 0
29.11.2018, 15:48
    #39740431
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
StarikNavyOleon,
поиск "for xml path"

выгрузить из базы, чтобы загрузить в базу это сильно))А что смешного ? А если базы разные ?
...
Рейтинг: 0 / 0
29.11.2018, 15:55
    #39740436
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
StarikNavyOleon,
поиск "for xml path"

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

Зато быстро.
Особенно, если реально большой.
...
Рейтинг: 0 / 0
29.11.2018, 15:58
    #39740439
Oleon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
Есть процедура, которая по ссылка загружает 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, но дальше, еще каждую строку нужно разбить на колонки.
вот тут не моогу придумать.
...
Рейтинг: 0 / 0
29.11.2018, 16:19
    #39740450
StarikNavy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
Oleon строку нужно разбить на колонки.
.
Код: sql
1.
substring
...
Рейтинг: 0 / 0
29.11.2018, 16:52
    #39740464
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
Oleon,

хорошо еще раз подумайте и не превращайте сервер баз данных в сервер приложений. Не, ну им орехи еще можно колоть, чё.
Для загрузки и импорта существуют другие средства, например Integration Services.
...
Рейтинг: 0 / 0
29.11.2018, 16:59
    #39740467
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
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)


col1col2col31vova3 4petya6 789
...
Рейтинг: 0 / 0
29.11.2018, 17:47
    #39740489
Oleon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
Небольшой опыт использования пакетов в сравнении с процедурами, говорит о том, что так проще вносить изменения и исправлять баги. Да и по времени получается быстрее и в тестировании. Если нет каких-то больших требований к скорости. то думаю, можно было бы и в процедуре все сделать.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
;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 мегабайта так развернуть:)
...
Рейтинг: 0 / 0
29.11.2018, 18:03
    #39740497
Oleon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
court - row_number()over(order by ( select 1 )) - вот это интересный ход.
...
Рейтинг: 0 / 0
29.11.2018, 18:05
    #39740498
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
Oleoncourt - row_number()over(order by ( select 1 )) - вот это интересный ход.
row_number()over(order by 1/0)
...
Рейтинг: 0 / 0
29.11.2018, 18:43
    #39740514
Oleon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
Это еще интереснее:)
...
Рейтинг: 0 / 0
30.11.2018, 05:31
    #39740637
andrey odegov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
еще может встретиться ORDER BY (SELECT NULL) .
...
Рейтинг: 0 / 0
30.11.2018, 09:39
    #39740678
tunknown
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
Владислав Колосовне превращайте сервер баз данных в сервер приложений.SQL Server- есть сервер приложений, разрабатываемых на языке Transact-SQL. Поэтому, его нельзя превратить.
...
Рейтинг: 0 / 0
30.11.2018, 11:14
    #39740746
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
tunknown,

cool story, но эта парадигма работает лишь для small office home office применений.
...
Рейтинг: 0 / 0
30.11.2018, 11:21
    #39740752
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
...
Рейтинг: 0 / 0
30.11.2018, 14:18
    #39740899
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
Владислав Колосовtunknown,

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

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

И вообще, парадигмы ентерпрайз/хоум оффис применений заключаются никак не в формальном количестве уровней, это нечто другое. Может быть масштабное, настоящее приложение для крупного бизнеса, сделанное как прога обработчик текстовых файлах, и приложение, тянущее только на хоум офис, при этом сделанное как многоуровневое распределённое решение на джаве, но приименять его в крупном бизнесе будет нельзя.
...
Рейтинг: 0 / 0
30.11.2018, 17:49
    #39741186
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
alexeyvg,

почему Вы называете "средствами импорта" Unsafe CLR процедуру, выполняющую запросы к сторонним веб-ресурсам? Так можно и утку журавлём назвать. Более, чем на small системах с 2-3 многостаночниками такие "интеграции" приведут к заметным проблемам при эволюционной разработке и проблемам в сопровождении кода. Например, если будет принято решение получать данные из других источников. Такие решение относят к технологиям с сильной связностью со всеми вытекающими.
...
Рейтинг: 0 / 0
30.11.2018, 20:03
    #39741280
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
BCP
3 волшебные буквы
и поиск по ним.
...
Рейтинг: 0 / 0
30.11.2018, 20:33
    #39741294
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
OleonЕсть процедура, которая по ссылка загружает csv файл в переменную, нужно сделать из нее select.

А доступа к процедуре у вас нет? Гораздо проще было бы bulk insert аж временную таблицу и уже развлекаться как вам удобно.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
27.01.2021, 08:12
    #40039214
Парсинг csv в T-SQL.
court,

string_split не гарантирует порядок значений
https://docs.microsoft.com/ru-ru/sql/t-sql/functions/string-split-transact-sql?view=sql-server-ver15

разделитель может встречаться в значениях, и тогда значение должно быть в кавычках

кавычки могут встречаться в значениях и тогда они экранируются становятся двойными.

я писал как-то код который всю эту музыку учитывал, но получилось довольно задумчиво.

а вообще тема разбора csv на t-sql весьма актуальная по крайней мере для меня, очень хочется поиметь нечто типа csvToJSON в штатном наборе функционала
...
Рейтинг: 0 / 0
27.01.2021, 16:08
    #40039399
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг csv в T-SQL.
Девиченский Василий,

SSIS для этого придумали, зачем городить встроенные средства.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Парсинг csv в T-SQL. / 23 сообщений из 23, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]