【发布时间】:2011-01-04 21:21:24
【问题描述】:
我有这个 BCP 命令:
'bcp DBName..vieter out c:\test003.txt -c -T /t"\",\"" -S SERVER'
我得到的输出 CSV 没有在字段名称周围加上引号,而是在逗号周围加上引号!我怎样才能让/t"\",\"" 在所有字段周围加上引号。
谢谢大家
【问题讨论】:
标签: sql-server csv bcp
我有这个 BCP 命令:
'bcp DBName..vieter out c:\test003.txt -c -T /t"\",\"" -S SERVER'
我得到的输出 CSV 没有在字段名称周围加上引号,而是在逗号周围加上引号!我怎样才能让/t"\",\"" 在所有字段周围加上引号。
谢谢大家
【问题讨论】:
标签: sql-server csv bcp
或者,如果您对基于 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 "SELECT char(34) + * +char(34) FROM atable queryout "C:\temp\out.csv" -T -N -c /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'
【讨论】:
QUERYOUT,然后使用QUOTENAME(column,'"') 为文本字段创建查询。
EXEC master..xp_cmdshell @bcpCommand 中使用上述内容
我猜你的目标是通过使用唯一标识符清楚地分隔字段值,以便导入过程没有问题。
我遇到了同样的问题,发现这个解决方法很有用:使用不寻常的字段终止符,例如 | 甚至是字符串 /#/ 可能非常独特,不应该与您的字符串内容混淆。你也可以使用 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
【讨论】:
这是我使用的命令列表。
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
【讨论】:
删除前导引号的实际可行答案是:
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"/>
这个技巧很有效,因为您正在添加一个字段(文件的接口)来检测第一个分隔符,这会导致始终为空值,但不会添加一行(查询输出的接口)。
【讨论】:
您需要使用 CHAR(34) 作为报价单。此页面有更多详细信息:http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=153000
【讨论】: