使用bat文件在csv中导出数据

时间:2019-10-09 21:53:46

标签: sql-server csv sqlcmd

我正在尝试使用以下命令将数据导出到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 :(得分:0)

很高兴知道您的数据类型。但是通常将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文件调用的。如果直接从命令行调用,双引号可能会有所不同。另外,在我的系统上,由于双双引号的合并方式,在sql行;后必须有11个空格。是的,到处都有单引号和双双引号。 根据进一步的评论,这是我编写.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"