SQL Server BCP: как поместить кавычки во все поля? - PullRequest
9 голосов
/ 14 января 2010

У меня есть команда BCP:

'bcp DBName..vieter out c:\test003.txt -c -T /t"\",\"" -S SERVER'

Выходной CSV, который я получаю, не заключает в кавычки имена полей, вместо этого он ставит его в запятую! Как я могу заставить /t"\",\"" ставить кавычки вокруг всех полей.

Спасибо всем

Ответы [ 6 ]

10 голосов
/ 14 января 2010

Установка ограничителя строки в дополнение к ограничителю поля должна сделать свое дело

'bcp DBName..vieter out c:\test003.txt -c -T -t"\",\"" -r"\"\n\"" -S SERVER'

Скорее всего, это сработает, но не будет лидирующего "для первого поля первой строки и, возможно, последнего из последнего, я не уверен, просто догадываюсь, сервера здесь нет!"

или попробуйте использовать QUOTENAME для переноса текстовых полей (вы также можете переносить числа, но это обычно не требуется.

'bcp "SELECT id, age, QUOTENAME(name,'"') FROM DBName..vieter" queryout c:\test003.txt -c -T -t"," -S SERVER'
8 голосов
/ 20 декабря 2012

Вам нужно использовать CHAR (34) для цитаты. На этой странице более подробная информация: http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=153000

1 голос
/ 29 августа 2018

Полагаю, ваша цель состояла в том, чтобы четко отделить значения полей с помощью уникального идентификатора, чтобы процедура импорта не вызывала проблем.

У меня возникла та же проблема, и я нашел эту работу полезной: использование необычного терминатора поля, например | или даже строки /#/, может быть очень уникальным и не должно портить содержимое строки. Вы также можете HEX-значения (ограничено, см. https://docs.microsoft.com/en-us/sql/tools/bcp-utility?view=sql-server-2017)

экспорт

bcp DB.dbo.Table out /tmp/output2.csv -c -t "/#/" -U sa -P secret -S localhost

импорт

bcp TargetTable in /tmp/output2.csv -t "/#/" -k -U sa -P secret -S localhost -d DBNAME -c -b 50000 
1 голос
/ 26 февраля 2018

bcp "SELECT char (34) + * + char (34) ОТ доступного запроса" C: \ temp \ out.csv "-T -N -c / t" \ ", \" "

Это ставит кавычки до и после каждого поля (включая первое и последнее).

1 голос
/ 01 августа 2017

Вот список команд, которые я использовал.

BCP "DECLARE @colnames VARCHAR(max);SELECT @colnames = COALESCE(@colnames + ',', '') + column_name from databaseName.INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='tableName'; select @colnames;" queryout "C:\HeadersOnly.csv" -r"\n\""  -c -T -Uusername -Ppassword -SserverName

bcp databaseName.schema.tableName out "C:\EmployeeDatawithoutheaders.csv" -T -t"\",\"" -r"\"\n\"" -c -Uusername -Ppassword -SserverName

copy /b C:\HeadersOnly.csv+C:\EmployeeDatawithoutheaders.csv C:\EmployeeData.csv

del C:\HeadersOnly.csv

del C:\EmployeeDatawithoutheaders.csv
0 голосов
/ 03 февраля 2017

Фактический рабочий ответ, который удаляет ведущую цитату, должен:

A) создать файл формата с помощью bcp:

bcp db.schema.tabel format nul -c -x -f file.xml -t"\",\"" -r"\"\r\n" -T -k

B) отредактируйте этот файл, чтобы вручную скопировать поле 1 в поле 0 выше, в качестве первого поля установите Max_Length = 1 и удалите разделитель, а одна квота была в поле1

<FIELD ID="0" xsi:type="CharTerm" TERMINATOR="\&quot;" MAX_LENGTH="1" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>

Трюк работает, когда вы добавляете поле (интерфейс к файлу), чтобы обнаружить первый разделитель, что приводит к всегда нулевому значению, но не добавляет строку (интерфейс для вывода запроса).

...