【问题标题】:Export data with bcp utility with double quotes使用带双引号的 bcp 实用程序导出数据
【发布时间】:2019-05-18 10:33:09
【问题描述】:

我正在尝试使用 bcp 实用程序 命令行从 MS sql 服务器导出数据。问题是在导出的输出中缺少第一行的第一个双引号,我无法解释原因。

在我用于导出的命令下方:

 /opt/mssql-tools/bin/bcp db_schema out dump.csv -c -t"\",\"" -r"\"\n\"" -S my_host -U my_user

但输出结果缺少导出的csv文件第一行(仅第一行)的第一个双引号:

801","40116","Hazelnut MT -L","Thursday Promo","Large","","5.9000","","801","1.0000","","3.6500","2.2500",".0000","default","","","","","Chatime","02/06/2014","09125a9cfffd4143a00e73e3b62f15f2","CB01","",".0000","5.9000","6.9000",".0000",".0000",".0000",".0000",".0000",".0000","0","","0","0","0","","","","","","","","","Modern Milk Tea","","","0","","","1","0","","","","","","","","0","Hau Chan","","","","","","","","","","0","","","","","","","-1","","","","","","","","","","","","0","00000000420714AA","2014-06-02","1900-01-01","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""

我错过了什么吗?

【问题讨论】:

  • 您为 -t 和 -r 传递的值对我来说看起来很可疑。您希望字段和行终止符(分别)是什么?
  • @BenThul 我会用预期的结果和我得到的错误结果更新问题。

标签: sql-server regex shell bcp


【解决方案1】:

如果您知道字段名称,可以尝试以下方法:

Create Table [names]
(
Id Int,
fname VarChar(15),
lname VarChar(25)
)
Insert Into names Values
(1, 'Jim', 'Morrison'),
(2,'Robert', 'Plant'),
(3,'Janis', 'Joplin')

BCP 命令:使用 quotename() 和 char(34)

(此 BCP 命令使用可信连接)

bcp "SELECT quotename(Cast(Id As VarChar(15)),char(34)), quotename(fname,char(34)), quotename(lname,char(34)) FROM names" queryout dump.csv -c -t"," -S SERVER -d DBNAME -T

结果:

"1","Jim","Morrison"
"2","Robert","Plant"
"3","Janis","Joplin"

【讨论】:

  • 巧妙地使用quotename()。我要把那个放在我的花样包里!
【解决方案2】:

我敢打赌,您在文件末尾也有一行只是一个双引号。为什么?使用您提供的命令行开关,您说的是“以"," 结束每个字段,以"\n" 结束每一行”。这就是它正在做的事情。

因此,第二行和后续行以双引号开头,因为前一行以一个结尾

Clippy DBA 说“您似乎正在尝试生成 CSV”。不知道为什么,我很难……呃……Clippy 提出一个替代方案。具体来说,读取这个文件的内容是什么?你会用 Excel 或其他需要特定格式的东西来阅读这个吗?您会将其导入到另一个数据库表中吗?

【讨论】:

    【解决方案3】:

    level3looper 提供的quotename 答案适用于您的情况。

    为了完整起见,我提供了一个我过去为相同目的提供的解决方案。 我更喜欢这个,因为它在格式文件中保留了格式的定义,这是我更喜欢去获取该信息的地方。报价名称是快速、临时工作的好解决方案,但对于自动化、业务流程,我建议使用下面的链接。

    基本上,您只需在提取文件定义的开头添加一个“虚拟”列,并用单个双引号分隔该列。然后你还要在格式文件中记下跳过第一列。这只会在行首提供双引号。

    sql server bcp bulk insert pipe delimited with text qualifier format file

    【讨论】:

      猜你喜欢
      • 2013-05-17
      • 2016-09-19
      • 1970-01-01
      • 2010-11-07
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多