SQL-сервер BCP:Как поставить кавычки вокруг всех полей?
-
20-09-2019 - |
Вопрос
У меня есть эта команда BCP:
'bcp DBName..vieter out c:\test003.txt -c -T /t"\",\"" -S SERVER'
В выходном CSV-файле имена полей заключаются не в кавычки, а в запятые!Как я могу получить /t"\",\""
чтобы поставить кавычки вокруг всех полей.
Спасибо всем
Решение
Установка признака конца строки в дополнение к признаку конца поля должна помочь.
'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'
Другие советы
Вам нужно использовать CHAR(34) для цитаты.На этой странице есть более подробная информация: http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=153000
Вот список команд, которые я использовал.
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
bcp "SELECT char(34) + * +char(34) FROM table queryout "C: emp\out.csv" -T -N -c /t"\",\""
Это поставит кавычки до и после каждого поля (включая первое и последнее).
Я предполагаю, что ваша цель состояла в том, чтобы четко разделить значения полей с помощью уникального идентификатора, чтобы процедура импорта не вызывала проблем.
У меня была такая же проблема, и я нашел это решение полезным:Например, использование необычного терминатора поля. |
или даже строка /#/
может быть очень уникальным и не должен влиять на содержимое строки.Вы также можете использовать 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
Фактический работоспособный ответ, который удаляет ведущую кавычку, заключается в следующем:
А) создать файл формата с помощью bcp:
bcp db.schema.tabel format nul -c -x -f file.xml -t"\",\"" -r"\"\r\n" -T -k
Б) отредактируйте этот файл, чтобы вручную скопировать поле 1 в поле 0 выше, в качестве первого поля установите Max_Length=1 и удалите разделитель и одну кавычку, которая была в поле 1.
<FIELD ID="0" xsi:type="CharTerm" TERMINATOR="\"" MAX_LENGTH="1" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
Трюк работает, поскольку вы добавляете поле (интерфейс к файлу) для обнаружения первого разделителя, что приводит к всегда нулевому значению, но не добавляете строку (интерфейс для вывода запроса).