Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Помогите пожалуйста в решении проблемы. Имеется таблица где есть 10 столбцов и 3 тысячи строк. Используя команду bcp, я экспортирую данные из таблицы в файл txt данные. Они попадают в него одной строкой. Используя разделить строки, ROWTERMINATOR ='\n', можно ли сделать так, чтобы например первые 7 столбцов были на 1 строке, а начиная с 8 столбца данные попадали на вторую строку, а с 3-й строки шла уже новая запись с таблицы sql в том же формате, т.е. 7 столбцов на 3 строке, 3 столбца на 4й и т.д. |
10 апр 18, 20:05 [21327703] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Т.е. как сделать разделение строк в результирующем файле по названию столбца, но чтобы оставшиеся столбцы попадали на следующую строку. поле имеет тип данных varchar 100 |
10 апр 18, 20:07 [21327708] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20973 |
Скармливайте bcp не таблицу, а запрос, который собирает все поля записи в одно текстовое со всеми нужными разделителями, переводами строк и прочей шелухой. |
10 апр 18, 20:18 [21327731] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Akina, а вы не могли бы привести пример селекта, где выводится результат в том формате, какой я описал? |
10 апр 18, 20:49 [21327786] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
|
||
10 апр 18, 20:49 [21327788] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Дедушка, нужно для одного проекта, по другому никак не решить. Возможно ли запросом на выборку в самом sql сделать такое? либо же создать временную таблицу куда будут копироваться строки в таком формате поле чего уже с помощью bcp сделать то, что мне нужно? |
10 апр 18, 21:33 [21327863] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
вас устроит если в файле будет вот так: p1;p2;p3;p4;p5 p6;p7;;;; p1;p2;p3;p4;p5 p6;p7;;;; здесь разделитель ; для наглядности ? |
10 апр 18, 21:53 [21327901] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Дедушка, да, это именно то, что мне нужно. столбец p5 имеет тип данных varchar(100). не могу понять как сделать, чтобы при экспорте в текстовый файл было именно такое представление. Выше посоветовали сделать именно выборку такую в sql сначала. |
10 апр 18, 21:56 [21327905] Ответить | Цитировать Сообщить модератору |
Andy_OLAP Member Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион Сообщений: 3151 |
2 раздельных текстовых файла, у которых будет одинаковое количество строк. И простой скрипт на powershell, который сделает третий файл, читая первую строку из первого файла, затем первую из второго, затем вторую из первого и вторую из второго и так далее. Кошерных примеров в гугле можно найти таки вагон и небольшую тележку. Нужно поступать как советские инженеры - максимально упрощать задачу. |
||
10 апр 18, 21:58 [21327910] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Дедушка, для примера, у меня сейчас все идет в одну строку: p1p2...p7. Если р1 имеет varchar(4) а в таблице только 3 символа то в текстовом файле записывается 3 символа и один пробел. То же самое и с р5, у него в таблице 100 символов, но там в основном занято по 60-70, остальное пробелы в текстовом файле. И мне нужно чтобы после пробелов, после 100 символов остальное шло на следующую строку и т.д. |
10 апр 18, 21:59 [21327911] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Andy_OLAP, гениально, спасибо большое. Попробую так, но мне кажется, что можно сделать это все и в sql. |
10 апр 18, 22:00 [21327915] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Andy_OLAP, посмотрел материал по поводу объединения двух текстовых файлов, пишут что очень долго делает даже небольшие объемы |
10 апр 18, 22:14 [21327949] Ответить | Цитировать Сообщить модератору |
Andy_OLAP Member Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион Сообщений: 3151 |
Попробуйте готовое решение. Думаю, скорость будет приемлимой. |
||
10 апр 18, 22:17 [21327957] Ответить | Цитировать Сообщить модератору |
Andy_OLAP Member Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион Сообщений: 3151 |
OlegEgorov11, Только там в одну строку соединяют 2 строки, а Вам нужно с разделителем, чтобы тоже 2 строки получилось. Цикл отработает достаточно быстро. |
10 апр 18, 22:18 [21327961] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Так как столбец после которого нужно внести разделение имеет 10 и более пробелов возможно ли сделать разделение при помощи bcp, где разделителем выступают пробелы, как например((**\t**, end, !!!!!!!!!!, \t—\n и т. д.)), в этом случае я просто в bcp после запроса добавлю скобки в которых будут пробелы ( )? |
10 апр 18, 22:22 [21327968] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
как запасной вариант:declare @t table (i int) declare @p table (p1 char(2), p2 char(2), p3 char(2), p4 char(2), p5 char(2)) insert @t (i) select row_number()over(order by (select 1)) - 1 from (values (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t1(i) cross join (values (0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t2(i) insert @p (p1, p2, p3, p4, p5) values ('A1', 'B1', 'C1', 'D1', 'E1'), ('A2', 'B2', 'C2', 'D2', 'E2'), ('A3', 'B3', 'C3', 'D3', 'E3') ; with t1 as ( select p1, p2, p3, rn + i as n from ( select p1, p2, p3, row_number()over(order by (select 1)) as rn from @p p )q inner join @t t on t.i = q.rn - 1 ), t2 as ( select p4 as p1, p5 as p2, null as p3, rn + i as n from ( select p4, p5, row_number()over(order by (select 1)) as rn from @p p )q inner join @t t on t.i = q.rn ) select p1, p2, p3, n from t1 union all select p1, p2, p3, n from t2 order by nдалее выгрузка через bcp |
10 апр 18, 22:25 [21327976] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Дедушка, спасибо)) |
10 апр 18, 22:34 [21327986] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Дедушка, подскажите, тот запрос, что вы написали, он представляет матрицу(А1,В1,С1и т.д) в формате который мне нужен, но как сделать выборку в этом формате из селектра, где построчно выводится тысячи строк к примеру из 10 столбцов? |
11 апр 18, 10:11 [21328567] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Дедушка, я, так понимаю, что нужно вместо матрицы добавить селект, но тогда ругается на несовместимость values, хотя в начале запроса я исправляю, как у меня в таблице, varchar и т.д |
11 апр 18, 10:31 [21328653] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Дедушка, или нужно делать весь этот запрос из нужного мне селекта? |
11 апр 18, 11:31 [21328894] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
OlegEgorov11, @p - это ваша таблица (замените @p на dbo.MyTable, например) в t1 поля p1, p2, p3 это поля вашей таблицы которые "должны быть в первой строке файла", а в t2 поля p4, p5 это оставшиеся поля вашей таблицы которые "должны быть во второй строке файла" |
11 апр 18, 11:53 [21328967] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Дедушка, при замене в 4х местах @р на имя таблицы, после дбо, в первом месте, подчеркивает точко, как некорректный синтаксес |
11 апр 18, 12:26 [21329137] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Дедушка, а можно в этом запросе где нибудь вставить условие, либо же делать отдельно запрос с условием и от него уже этот запрос? |
11 апр 18, 19:39 [21331044] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
Получайте нужные вам данные любым нужным вам запросом. Сохраняйте результат этого запроса во временную таблицу (#p, например). В приведённом выше коде убираете создание и заполнение таблицы @p (тестовая). В t1 и t2 заменяете @p на #p. |
11 апр 18, 19:57 [21331061] Ответить | Цитировать Сообщить модератору |
OlegEgorov11 Member Откуда: Сообщений: 92 |
Дедушка, спасибо, у меня все получилось, только один вопрос. Можно ли как то убрать столбец с номером, я понимаю что по нему идет сортировка, но он мне сильно мешается, есть вариант засунуть весь этот запрос в подзапрос и оттуда уже выбрать без столбца этого? |
12 апр 18, 20:34 [21334832] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |