|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
Есть плоский файл, в каждой строке по ~300 полней. Есть маппинг полей в файле к полям в таблицах. смысл в том, чтоб за одну прочитанную строку Reader'ом, добавить в таблицы записи согласно маппингу. Косяк в том, что BulkCopy принимает в качестве параметров только 1 таблицу и только 1 источник. Следовательно, мне придется выполнять пакетную вставку для каждой таблички отдельно и каждый раз перечитывать файл источник Сиквенс у меня сквозной и заранее известный для всех строк, вопрос только в том, как за 1 проход вставить во все таблички записи. Или придется колхозить свой BulkCopy? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2018, 18:36 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
Roman MejtesЕсть маппинг полей в файле к полям в таблицах.как выглядит? Или ручной формат? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2018, 19:06 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
Roman Mejtesколхозитьразве конвертнуть файл данных или разбить на несколько по числу таблиц хуже чем колхозить? Всегда лучше подогнать формат под сиквел чем чем сиквел под твой формат. imho ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2018, 19:51 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2018, 20:21 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
LRRoman Mejtes, сделать несложно - вьха + INSTEAD OF Trigger т.е., в эту вьюху и заливать BulkCopy, ну а в триггере уже распихивать по таблицам Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2018, 20:27 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
LRвьха + INSTEAD OF Trigger прикольно. Но тогда можно и залить все в одну таблу и раскидать потом. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2018, 20:31 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
Petro123LRвьха + INSTEAD OF Trigger прикольно. Но тогда можно и залить все в одну таблу и раскидать потом. Так ведь "instead of", зачем еще в какую-то таблицу? (Во вьюху напрямую нельзя залить, если базовых таблиц несколько). ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2018, 20:42 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
LRТак ведь "instead of", зачем еще в какую-то таблицу? (Во вьюху напрямую нельзя залить, если базовых таблиц несколько).Вернее, вьюха - это лишь оболочка (над таблицей/ами) - заливать можно лишь в таблицы, но можно и _через_ вьюхи (если базовая таблица одна), в т.ч. можно и через такие вот триггеры - вьюха задает формат данных (перечень полей), а в триггере можно уже делать все что угодно, ссылаясь на заливаемые данные как на inserted. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2018, 20:51 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
LR, Да знаю я что такое триггер. Просто это уже не совсем импорт. По мне лучше util.exe table1 util.exe table2 сделать. Но выбирать автору. Мне нравится разнообразие идей. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2018, 21:09 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
Roman Mejtesи каждый раз перечитывать файл источник ничего страшного ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2018, 21:20 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
Roman MejtesИли придется колхозить свой BulkCopy? Колхозить свой именно bulk (т.е. аналог BULK INSERT) - проще убиться. TDS-протокол - это то еще развлечение, я это проходил. Проще действительно view+триггер. Или залить во временную таблицу и раскидать обычным T-SQL батчем в одной транзакции. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 06:47 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
Roman Mejtes... Сиквенс у меня сквозной и заранее известный для всех строк, вопрос только в том, как за 1 проход вставить во все таблички записи. Или придется колхозить свой BulkCopy? Варианты: с триггерами, процедурами и вариациями -- сразу нет. Правильно: Bulk в специальную таблицу импорта с полями 1 к 1, как в файле. Такую таблицу можно даже создавать на лету под каждый такой импорт. Потом, загруженные записи из таблицы перекладываешь как хочешь куда хочешь SQL-инструкциями. Что это даёт: транзакционность, полный контроль, асинхронность с возможностью отслеживать процесс в любой момент, возможность постобработки, валидации и проверки со всякими джойнами и т.д. Подходит для большинства задач интеграции больших и средних объёмов данных. А триггеры, процедуры и прочая ересь, это однозначно бууэээ... Никогда так не делай. Никогда. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 07:03 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныИли залить во временную таблицу и раскидать обычным T-SQL батчем в одной транзакции. Только так ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 07:04 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
hVosttПравильно: Bulk в специальную таблицу импорта с полями 1 к 1, как в файле. Если формат файла не печатала Маша на машинке. Конвертация файла занимает секунды. Импорт по сети - минуты. Ну и ещё бывают один ко многим данные. Опять же предварительный конверт файла входного. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 07:19 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
Petro123hVosttПравильно: Bulk в специальную таблицу импорта с полями 1 к 1, как в файле. Если формат файла не печатала Маша на машинке. Конвертация файла занимает секунды. Импорт по сети - минуты. Ну и ещё бывают один ко многим данные. Опять же предварительный конверт файла входного. Если нарушение типов это одно, тогда это не верный формат файла, забулкать в любом случае не получится, только порциями, дополнительно выделив корректные данные с точки зрения типов. Остальное лучше делать, когда данные в БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 07:24 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
1. Написать хранимую процедуру добавления одной записи в N-таблиц. 2. Сгенерировать SQL-пакет, содержащий N вызовов этой хранимой процедуры. 3. Не забыть про set nocount on ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 07:25 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
hVosttPetro123пропущено... Если формат файла не печатала Маша на машинке. Конвертация файла занимает секунды. Импорт по сети - минуты. Ну и ещё бывают один ко многим данные. Опять же предварительный конверт файла входного. Если нарушение типов это одно, тогда это не верный формат файла, забулкать в любом случае не получится, только порциями, дополнительно выделив корректные данные с точки зрения типов. Остальное лучше делать, когда данные в БД.да. Плюс еще корпоративная политика. Иногда БЛ бизнес логика не в базе. База просто таблички, а вся логика в классах. Тогда тоже я лучше разобью на 10 файлов одну простынь 300 полей и в потоках в фоне вставлю. Автору там виднее. Решений миллион. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 07:37 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
А еще, как вариант, сделать для загрузки SSIS-пакет, и запускать его программно. Внутри пакета раскладывать данные в отдельные таблицы. Тогда не нужно будет использовать T-SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 07:39 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныSSIS действительно. Про ETL забыли. Это его основная задача как у сабжа. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 07:46 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
Petro123да. Плюс еще корпоративная политика. Иногда БЛ бизнес логика не в базе. База просто таблички, а вся логика в классах. Тогда тоже я лучше разобью на 10 файлов одну простынь 300 полей и в потоках в фоне вставлю. Автору там виднее. Решений миллион. Тут речь не про логику. Логика, где бы она ни была, может работать не так быстро, как простая вставка. Например, банально, подсасывание справочников, проверка на дубли, валидация и т.д. Варианты на триггерах и процедурах ущербны чуть менее, чем полностью. Они конечно работают, и в простейших случаях даже не так уж и медленно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 07:53 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
Petro123Сон Веры ПавловныSSIS действительно. Про ETL забыли. Это его основная задача как у сабжа. Это при условии, что там MS SQL. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 07:55 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
hVostt, Конечно. У остальных нету AFAIK такой штуки. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 07:58 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
hVosttА триггеры, процедуры и прочая ересь, это однозначно бууэээ... Никогда так не делай. Никогда. Почему? В данном случае (BulkCopy в N таблиц из 1 источника) это (вью+триггер) самое простое и эффективное решение, имхо конечно. Вью можно сделать лишь "оберткой" для заливаемых данных, т.е., не основывая на каких-либо таблицах. Вот простецкий пример. 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. 25. 26. 27.
c# Код: 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. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 09:47 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
LRПочему?ну, он чуть преувеличил. Все варианты одинаковы). LRВот простецкий пример. Права на бд должны быть выше чем одычно. В продакшене у заказчика могут не дать. Как вариант плюсов. Минусов. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 10:04 |
|
BulkCopy в N таблиц из 1 источника
|
|||
---|---|---|---|
#18+
LRПочему? В данном случае (BulkCopy в N таблиц из 1 источника) это (вью+триггер) самое простое и эффективное решение, имхо конечно. Вью, которое на самом деле не вью, а генерация набора колонок. Триггер, который на самом деле выполняет задачи процедуры. Костыль на костыле. С определённого угла зрения, конечно может выглядеть, как "трюк". Тут уже действительно ИМХО )) Простое, это процедура, как предложил Алексей К. Эффективное? Нет. Ни разу, я вас умоляю. Ну и попробуйте булк в свою вью, посмотрим-с, как это у вас заработает. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2018, 10:23 |
|
|
start [/forum/topic.php?fid=20&fpage=29&tid=1399318]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 166ms |
0 / 0 |