|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
Всем привет! Пробую свои шаги в освоении MS SQL. И встала задача такого плана: имеем несколько файлов CSV и их надо импортировать в таблицу (таблицу временную) Притом как импортировать по одному файлу я разобрался, а как разом из каталога все файлы с разрешением CSV обработать у меня не получается. Притом что надо использовать курсор. Я в интернете нашел скрипт и пытался его под себя адаптировать но у меня ничего не вышло. Может поможете новичку? )) Мой запрос такой : Код: 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. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 13:06 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
Snegovik1987, для получения списка файлов и загрузки можно использовать такую обертку (выбираются все файлы .log из папки c:\temp). Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 13:20 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
komrad, Предварительно я создаю временную таблицу (т.к. у меня ее нет) Командами : IF (OBJECT_ID('tempdb..#csv_temp') IS NOT NULL) DROP TABLE #csv_temp; -- Создаю временную таблицу #csv_temp CREATE TABLE #csv_temp ( [Times] VARCHAR(100), [Caller_Name] VARCHAR (200), [Caller_Number] VARCHAR (200), [Callee_Name] VARCHAR (200), [Callee_Numbers] VARCHAR(100), [DOD] VARCHAR(100), [DID] VARCHAR(100), [Call_Duration_(s)] VARCHAR (200), [Talk_Duration_(s)] VARCHAR (200), [Status] VARCHAR(100), [Source_Trunk] VARCHAR(50), [Destination Trunk] VARCHAR(100), [Communication_Type] VARCHAR(100), [PIN_Code] VARCHAR(10), [Caller IP Address] VARCHAR(200), [Cost] VARCHAR(100), [Billing_Account] VARCHAR(100) И далее использую эту обертку которую вы предложили? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 13:32 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
Snegovik1987, да, сначала создаёте таблицу в обертку вставляете блок с bulk insert (set @sql ... exec (@sql)) после/вместо print-а полагаю, что: - файлы csv однотипные, - права на запуск sp_dirtree у вас есть, - у учетки сиквела есть доступ в папку с файлами ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 13:42 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
komrad Snegovik1987, да, сначала создаёте таблицу в обертку вставляете блок с bulk insert (set @sql ... exec (@sql)) после/вместо print-а полагаю, что: - файлы csv однотипные, - права на запуск sp_dirtree у вас есть, - у учетки сиквела есть доступ в папку с файлами Да файлы однотипные в остальном вроде все так. А скажите обязательно использовать курсор?В вашем примере его нет а в целом? Посмотрите пожалуйста - вот так : IF (OBJECT_ID('tempdb..#csv_temp') IS NOT NULL) DROP TABLE #csv_temp; -- Создаю временную таблицу #csv_temp CREATE TABLE #csv_temp ( [Times] VARCHAR(100), [Caller_Name] VARCHAR (200), [Caller_Number] VARCHAR (200), [Callee_Name] VARCHAR (200), [Callee_Numbers] VARCHAR(100), [DOD] VARCHAR(100), [DID] VARCHAR(100), [Call_Duration_(s)] VARCHAR (200), [Talk_Duration_(s)] VARCHAR (200), [Status] VARCHAR(100), [Source_Trunk] VARCHAR(50), [Destination Trunk] VARCHAR(100), [Communication_Type] VARCHAR(100), [PIN_Code] VARCHAR(10), [Caller IP Address] VARCHAR(200), [Cost] VARCHAR(100), [Billing_Account] VARCHAR(100) ) set nocount off; declare @files table (Times varchar(255), Caller_Name VARCHAR (200),Caller_Number VARCHAR (200)) declare @filename varchar(255) declare @path varchar(255) = 'c:\serg' insert into @files (TImes,Caller_Name,Caller_Number) exec xp_dirtree @path,1,1 delete @files where Times not like '%.csv' --select * from @files while exists (select top 1 1 from @files) begin select top 1 @filename=Times from @files /*import file*/ --print 'Import file: '+ @path+'\'+@filename bulk insert (set @sql ... exec (@sql)) delete @files where Times=@filename set @filename='' end ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 13:54 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
Snegovik1987 А скажите обязательно использовать курсор?В вашем примере его нет а в целом? "А скрипач не нужен, родной. Он только лишнее топливо жрёт." (с) классика в данном случае, вместо курсора используется цикл как-то так Код: 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. 25. 26. 27. 28.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 14:23 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
komrad Snegovik1987 А скажите обязательно использовать курсор?В вашем примере его нет а в целом? "А скрипач не нужен, родной. Он только лишнее топливо жрёт." (с) классика в данном случае, вместо курсора используется цикл как-то так Код: 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. 25. 26. 27. 28.
Благодарю Вас! Но в процессе запуска у меня ошибка выстреливает Код: 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. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53.
Сообщение 4866, уровень 16, состояние 8, строка 1 Массовая загрузка не удалась. Слишком длинный столбец в файле данных в строке 1, столбце 1. Убедитесь, что признак конца поля и конца строки были указаны правильно. Сообщение 7301, уровень 16, состояние 2, строка 1 Не удалось получить требуемый интерфейс ("IID_IColumnsInfo") от поставщика OLE DB "BULK" для связанного сервера "(null)". ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 14:50 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
Snegovik1987, Файлы такие во вложении ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 14:55 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
Snegovik1987, Поставил ROWTERMINATOR = ''0x0a'' и все получилось. Я благодарен Вам! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 15:03 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
Snegovik1987, это, в общем-то, дедовский способ, для решения ETL задач можно использовать Integration Services. Намного удобнее, к тому же, самодокументируемо и Вы сможете выполнять несколько задач загрузки одновременно. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 16:02 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
Владислав Колосов Snegovik1987, это, в общем-то, дедовский способ, для решения ETL задач можно использовать Integration Services. Намного удобнее, к тому же, самодокументируемо и Вы сможете выполнять несколько задач загрузки одновременно. Зато раз в десять быстрее и во стока же компактнее. Ну и запустить десяток скриптов, если очень хочется, тоже нема проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 19:45 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
Если у человека нет потребностей в трансформации данных, нет вопросов по безопасности (доступ SQL Сервера к файловой системе) , не требуется более-менее осмысленной обработки ошибок... другими словами, если человеку надо сделать простую копипасту - проще использовать обычный SQL, чем ставить SSIS, VS, настраивать и деплоить. Если человек "пробует свои шаги", то зачем отягощать его проблемами уровня миддл и выше? aleks222 Ну и запустить десяток скриптов, если очень хочется, тоже нема проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.02.2021, 23:57 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
.Евгений Если у человека нет потребностей в трансформации данных, нет вопросов по безопасности (доступ SQL Сервера к файловой системе) , не требуется более-менее осмысленной обработки ошибок... другими словами, если человеку надо сделать простую копипасту - проще использовать обычный SQL, чем ставить SSIS, VS, настраивать и деплоить. Если человек "пробует свои шаги", то зачем отягощать его проблемами уровня миддл и выше? aleks222 Ну и запустить десяток скриптов, если очень хочется, тоже нема проблем. Да, все верно. Пробую свои силы. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2021, 09:15 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
komrad Snegovik1987, для получения списка файлов и загрузки можно использовать такую обертку (выбираются все файлы .log из папки c:\temp). Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Вы меня простите за занудство. А можете рассказать как работает этот цикл? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 10:34 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
Snegovik1987 Вы меня простите за занудство. А можете рассказать как работает этот цикл? буквально так, как там написано теперь с комментами Код: 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. 25. 26. 27. 28. 29.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 11:57 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
komrad, То есть логика такая : Объявляем переменные и таблицы с которой будет работать. Далее делаем занесение списка файлов в временную таблицу. Потом delete @files where subdir not like '%.log' - удаляем лишнее а лишнее это лишние файлы или что именно? Далее /*пока что-то (файлы) есть в таблице*/ while exists (select top 1 1 from @files) пока файл в таблице (я так понимаю пока один файл ) Добавляем его в таблицу и импортируем. И цикл работает по кругу пока все файлы с определенным расширением не заберет в таблицу? Скажите еще,у вас есть почта или другие каналы связи? У меня есть предложение. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 12:17 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
Snegovik1987 komrad, То есть логика такая : 1) Объявляем переменные и таблицы с которой будет работать. 2) Далее делаем занесение списка файлов в временную таблицу. 3) Потом delete @files where subdir not like '%.log' - удаляем лишнее а лишнее это лишние файлы или что именно? в этом примере обрабатывались файлы с расширением log поскольку в папке могут быть другие файлы, которые обрабатывать не надо, то удаляем все файлы с расширением отличным от log Snegovik1987 4) Далее /*пока что-то (файлы) есть в таблице*/ while exists (select top 1 1 from @files) пока файл в таблице (я так понимаю пока один файл ) это проверка на наличие хотя бы одного (top 1) файла в таблице если файлов в таблице нет, то цикл заканчивается Snegovik1987 5) Добавляем его в таблицу и импортируем. И цикл работает по кругу пока все файлы с определенным расширением не заберет в таблицу? все файлы и так уже в таблице - см. п.2-3 в цикле берется один любой (нет сортировки к top 1) файл из таблицы и обрабатывается как нужно Snegovik1987Скажите еще,у вас есть почта или другие каналы связи? У меня есть предложение. почта в профиле ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 13:05 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
komrad Snegovik1987 komrad, То есть логика такая : 1) Объявляем переменные и таблицы с которой будет работать. 2) Далее делаем занесение списка файлов в временную таблицу. 3) Потом delete @files where subdir not like '%.log' - удаляем лишнее а лишнее это лишние файлы или что именно? в этом примере обрабатывались файлы с расширением log поскольку в папке могут быть другие файлы, которые обрабатывать не надо, то удаляем все файлы с расширением отличным от log Snegovik1987 4) Далее /*пока что-то (файлы) есть в таблице*/ while exists (select top 1 1 from @files) пока файл в таблице (я так понимаю пока один файл ) это проверка на наличие хотя бы одного (top 1) файла в таблице если файлов в таблице нет, то цикл заканчивается Snegovik1987 5) Добавляем его в таблицу и импортируем. И цикл работает по кругу пока все файлы с определенным расширением не заберет в таблицу? все файлы и так уже в таблице - см. п.2-3 в цикле берется один любой (нет сортировки к top 1) файл из таблицы и обрабатывается как нужно Snegovik1987Скажите еще,у вас есть почта или другие каналы связи? У меня есть предложение. почта в профиле Спасибо. Я написал на почту. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2021, 13:58 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
пытаюсь загрузить файл, скуль не пишет ошибок, а только что затронуто 0 строк. куда копать и на какую глубину - не понятно создал таблицу: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
импортирую: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Файл во вложении... Где камни? Подскажите, пожалуйста Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor) Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2022, 21:27 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
Двоичник пытаюсь загрузить файл, скуль не пишет ошибок, а только что затронуто 0 строк. куда копать и на какую глубину - не понятно создал таблицу: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
импортирую: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Файл во вложении... Где камни? Подскажите, пожалуйста Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2019 Standard 10.0 <X64> (Build 17763: ) (Hypervisor) Спасибо Добавь параметр ERRORFILE ='error_file_path', выполни команду еще раз и смотри что появилось в файле ошибок. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2022, 23:01 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
flexgen, файл ошибок не создался ... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2022, 09:13 |
|
Массовый импорт CSV в SQL
|
|||
---|---|---|---|
#18+
Двоичник пытаюсь загрузить файл, скуль не пишет ошибок, а только что затронуто 0 строк. куда копать и на какую глубину - не понятно у Вас не стандартный разделитель строк всего лишь символ 0A (символ перевода строки, как в файлах UNIX) Код: plaintext 1. 2.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.02.2022, 10:14 |
|
|
start [/forum/topic.php?fid=46&fpage=3&tid=1683834]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 144ms |
0 / 0 |