我正在尝试使用SQL Server中的BCP命令来提取文件中的某些记录。但是,生成文件时,每一列的结果之间都存在提取空间。
尝试一下,我只写了这么简单的基本SQL查询
select 'ABC', 40, 'TEST','NOTWORKING'
当我们复制上述查询的输出并将其粘贴到记事本中时,输出为
ABC 40 TEST NOTWORKING
是否注意到每个值之间的空格?系统使用BCP命令生成的文件在输出文件中也有相同的空间,这是不正确的。我想在输出文件中看到的是
ABC40TESTNOTWORKING
什么是导致此问题的原因?看到这样奇怪的问题我感到非常惊讶,并希望可以通过一些更改或设置来解决它。请帮忙。
Sample BCP command
EXEC xp_cmdshell 'bcp "select ''ABC'', 40, ''TEST'',''NOTWORKING''" queryout "E:\Testfile.txt" -c -T -S""'
Output in the File - Testfile.txt
ABC 40 TEST NOTWORKING
答案 0 :(得分:3)
这些值之间可能会有选项卡。如果要使用单个值,请使用concat()
:
select CONCAT('ABC', 40, 'TEST', 'NOTWORKING')
答案 1 :(得分:3)
没有问题。命令行没有字段终止符参数,因此使用默认选项卡。在文档中对此进行了描述:
-t field_term
指定字段终止符。默认值为\ t(制表符)。使用此参数可以覆盖默认字段终止符。有关更多信息,请参见Specify Field and Row Terminators (SQL Server)。
如果在bcp.exe命令中以十六进制表示法指定字段终止符,则该值将被截断为0x00。例如,如果您指定0x410041,则将使用0x41。
如果field_term以连字符(-)或正斜杠(/)开头,则-t和field_term值之间不能包含空格。
该链接指向整篇文章,该文章解释了如何对每个批量操作使用终止符。
对于复制/粘贴操作,它与SQL Server无关。 SQL Server没有UI,它是一项服务。我怀疑粘贴在记事本中的内容是从SSMS网格复制的。
SSMS与其他任何其他工具一样都是 client 工具。当您将数据从剪贴板复制到剪贴板时,它会决定将其放置在剪贴板中以及使用哪种格式。该格式可以是纯文本,使用空格和制表符进行布局,RTF,HTML等。
使用制表符作为字段分隔符的纯文本可能是任何工具的最佳选择,因为它可以保留视觉布局直到一点,并且仅使用单个字符作为分隔符。也可以使用使用空格的定长布局,但是这样会添加字符,这些字符很可能是字段的一部分。
编码和代码页
-c
使用用户的默认代码页导出数据。这意味着使用不同的代码页(排序规则)存储在varchar
字段中的文本可能会被弄乱。不可见的Unicode字符也会变形,并以其他形式或?
的形式出现。
-c
使用字符数据类型执行操作。此选项不会提示每个字段。它使用char作为存储类型,不带前缀,并以\ t(制表符)作为字段分隔符,并以\ r \ n(换行符)作为行终止符。 -c与-w不兼容。
最好使用-w
将文件导出为UTF16。
-w
使用Unicode字符执行批量复制操作。此选项不会提示每个字段。它使用nchar作为存储类型,没有前缀,使用\ t(制表符)作为字段分隔符,并使用\ n(换行符)作为行终止符。 -w与-c不兼容。
可以使用-C
参数指定代码页。例如,-C 1251
将使用Windows的Latin1代码页导出数据。 1253将使用希腊语代码页将其导出。
-C {ACP | OEM | RAW | code_page}
指定数据文件中数据的代码页。仅当数据包含字符值大于127或小于32的char,varchar或text列时,code_page才相关。
SQL Server 2016和更高版本也可以使用-C 65001
将文本导出为UTF8。早期版本不支持UTF8。
版本13之前的版本(SQL Server 2016(13.x))不支持代码页65001(UTF-8编码)。以13开头的版本可以将UTF-8编码导入到SQL Server的早期版本中。
所有这些都在bcp's online documentation中进行了描述。
这个主题对任何数据库都非常重要,以至于它在文档中有一个完整的部分,使用data format and considerations和format files to specify different settings per column描述了guidelines to ensure compatibility with other applications