我有这个 BCP 命令:
'bcp DBName..vieter out c:\test003.txt -c -T /t"\",\"" -S SERVER'
我得到的输出 CSV 没有在字段名称周围加上引号,而是在逗号周围加上引号!我怎样才能/t"\",\""
在所有字段周围加上引号。
谢谢大家
我有这个 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
或者,如果您对基于 Powershell 的脚本没问题,您可以尝试使用下面的代码,它会自动引用。
Invoke-sqlcmd -ConnectionString "Server=SERVERNAME, `
3180;Database=DATABASENAME;Trusted_Connection=True;" `
-Query "SET NOCOUNT ON;SELECT * FROM TABLENAME" -MaxCharLength 700 | `
Export-Csv -NoTypeInformation -path C:\temp\FileName.csv -Encoding UTF8
这是我使用的命令列表。
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 atable queryout "C:\temp\out.csv" -T -N -c /t"\",\""
这将在每个字段(包括第一个和最后一个)之前和之后加上引号。
我想您的目标是通过使用唯一标识符清楚地分隔字段值,以便导入过程没有问题。
我遇到了同样的问题,发现这个workaroud很有用:例如,使用不寻常的字段终止符|
甚至一个字符串/#/
都可能非常独特,不应该弄乱你的字符串内容。您还可以使用 HEX-Values(有限,请参阅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
删除前导引号的实际可行答案是:
A) 使用 bcp 生成格式文件:
bcp db.schema.tabel format nul -c -x -f file.xml -t"\",\"" -r"\"\r\n" -T -k
B) 编辑该文件以手动将字段 1 复制到上面的字段 0,作为第一个字段,设置 Max_Length=1 并删除分隔符和一个引号是在字段 1
<FIELD ID="0" xsi:type="CharTerm" TERMINATOR="\"" MAX_LENGTH="1" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
这个技巧很有效,因为您正在添加一个字段(文件的接口)来检测第一个分隔符,这会导致始终为空值,但不会添加一行(查询输出的接口)。