Экспортируйте данные в csv используя bat файл - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь экспортировать свои данные в файл csv, используя команду ниже. Я использую -s, для запятой. Это работает нормально, но я сталкиваюсь с одной проблемой, когда у моего имени клиента есть запятая (,) внутри. В этом случае он вырезает имя клиента в двух разных столбцах. Как мне решить эту проблему?

sqlcmd -S . -d MYDB -E -Q "set nocount on; select 'customer_id','customer_name','salesrep_id'; select customer_id,customer_name,salesrep_id from customer where customer_id=106866" -b -o C:\customer.csv -h-1 -s, -w 700

1 Ответ

0 голосов
/ 10 октября 2019

Было бы неплохо узнать ваши типы данных. Но обычно ставьте varchar в двойных кавычках. Вот основная идея:

select customer_id, '"' + customer_name + '"', salesrep_id from customer where customer_id=106866

Я обычно сам хочу явно создать строку csv, поэтому мои выборки обычно выглядят так:

select '"' + customer_id + '","' + customer_name + '"," + salesrep_id + '"' from customer where customer_id=106866

Если есть столбцы, которыечисла, затем я конвертирую столбец в varchar и не ставлю вокруг него двойные кавычки.

На основании ваших комментариев:

Вот файл .cmd, который я использую в производстве для созданияCSV-файл:

set proc=NoBillsReport
sqlcmd -E -S win11.net.davisbrownlaw.com -d ProLaw -Q "exec %proc%" -h -1 -W > "c:\2019\no-bills.csv"

Он использует хранимую процедуру и перенаправляет вывод вместо того, чтобы пытаться заставить SQL сделать вывод. Вот упрощенная версия моей хранимой процедуры:

--Header row
select '"Matter ID","Client Sort","Matter Description","Billing Initials","Area of Law","Fees No-Billed","Costs No-Billed"'

-- Costs that were no-billed in previous month
select '"' + matterid + '","' + clientsort + '","' + shortdesc + '","'
   + initials + '","' + areaoflaw + '",' + convert(varchar(50),nobilled_fees)
   + ',' + convert(varchar(50),nobilled_costs)
from Matters

и ее вывод:

"Matter ID","Client Sort","Matter Description","Billing Initials","Area of Law","Fees No-Billed","Costs No-Billed"
"70441233","ACME","Closing Wheel, Whenever","LA","IP",0.00,7.98

, которая прекрасно работает как содержимое файла .csv.

Хранимая процедура хороша тем, что она не должна помещаться в 1 длинную командную строку. Но, для вашего использования, я думаю, у этого есть шанс на работу:

sqlcmd -S . -d MYDB -E -Q "set nocount on; select '""customer_id"",""customer_name"",""salesrep_id""'; select convert(varchar(50),customer_id) + ',""' + customer_name + '"",""' + salesrep_id + '""' from customer where customer_id=106866;           " -h -1 -W > C:\customer.csv

Обратите внимание, что это вызывается из файла .cmd. Двойные двойные кавычки могут отличаться, если они вызываются напрямую из командной строки. Кроме того, в моей системе , 11 пробелов после ; в конце строки sql необходимы из-за того, как объединяются двойные двойные кавычки. И да, есть одинарные кавычки и двойные двойные кавычки повсюду. Основываясь на дальнейших комментариях, вот как я пишу файл .cmd для извлечения года, месяца, дня:

:: Get current year/month/day
for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('"echo.|date"') do (
    for /f "tokens=1-3 delims=/.- " %%A in ("%Date:* =%") do (
        set %%a=%%A&set %%b=%%B&set %%c=%%C)
    )
)
set /a "yy=10000%yy% %% 10000 %% 2000 + 2000,mm=100%mm% %% 100,dd=100%dd% %% 100"
:: Pad with leading zeros if needed
set mm=0%mm%
set mm=%mm:~-2%
set dd=0%dd%
set dd=%dd:~-2%

Тогда ваше имя файла будет "customer%yy%%mm%%dd%.csv"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...