如何使用 BCP 提取以竖线分隔的数据?

JP *_*han 5 sql-server t-sql

我尝试了以下命令

USE <DBNAME>
SELECT 'exec master..xp_cmdshell'
+ ' '''
+ 'bcp'
+ ' ' + TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME
+ ' out'
+ ' D:\'
+ TABLE_NAME + '.csv'
+ ' -c'
+ ' -t,'
+ ' -T'
+ ' -S' + @@SERVERNAME
+ ''''
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
Run Code Online (Sandbox Code Playgroud)

我想以以下格式获取数据。

格式将是管道分隔的文本文件,带有双引号文本限定符并且没有标题行。如何修改或编写 BCP 命令以获得所需的结果。

我的数据集只是一个客户表。

CustomerID  CustomerName         ContactName   Address        City    PostalCode  Country
1           Alfreds Futterkiste  Maria Anders  Obere Str. 57  Berlin  12209       Germany
Run Code Online (Sandbox Code Playgroud)

所需数据格式为

1|"Alfreds Futterkiste"|"Maria Anders"|"Obere Str. 57 Berlin"|12209|"Germany"
Run Code Online (Sandbox Code Playgroud)

Cra*_*ein 8

现在我更好地理解您正在尝试提取数据,这是一个新答案。这只是从我在 tempdb 中创建的表中提取数据。

use tempdb

-- drop table mytable

create table mytable 
(id int, customer_name varchar(55), cityname varchar(55), statename varchar(55))

insert into mytable 
values (1, 'a', 'a city', 'a state')
     , (2, 'b', 'b city', 'b state')
     , (3, 'c', 'c city', 'c state')
     , (4, 'd', 'd city', 'd state')


select cast(id as varchar(10)), customer_name, cityname, statename from mytable
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

这导致以下 bcp 命令

bcp "select cast(id as varchar(10)), customer_name, cityname, statename from mytable" queryout c:\temp\myTable.csv /S.\instance_name /d tempdb /c /t"|" -T
Run Code Online (Sandbox Code Playgroud)

更新此 bcp 命令将添加双引号

exec Master..xp_Cmdshell 'bcp "select cast(id as varchar(10)), quotename(customer_name,char(34)), quotename(cityname,char(34)), quotename(statename,char(34)) from mytable" queryout "c:\temp\myTable.csv" /S.\instance_name /d tempdb /c /t"|" /T'
Run Code Online (Sandbox Code Playgroud)

或者只是使用 bcp

bcp "select cast(id as varchar(10)), quotename(customer_name,char(34)), quotename(cityname,char(34)), quotename(statename,char(34)) from mytable" queryout "c:\temp\myTable.csv" /S.\instance_name /d tempdb /c /t"|" /T
Run Code Online (Sandbox Code Playgroud)

此 bcp 命令使用quotename函数。这允许您使用您喜欢的任何字符来分隔您的输出。

在此处输入图片说明