bcp命令输出中文字符而不是表

时间:2017-07-21 15:33:09

标签: sql-server batch-file sql-server-2012 bcp

我有一个批处理文件,使用BCP将分隔的文本文件导入SQL Server,使用SQLCMD运行一些处理,然后通过BCP输出处理后的数据。它目前提供一串中文字符而不是分隔的文本表。奇怪的是,它在两天前工作,我没有改变任何东西。

我已确认输入BCP和SQL Server处理步骤有效;保存输出数据的SQL Server表是正确的。我还尝试使用-C选项按建议here指定代码页,但没有任何更改。

这是有问题的BCP代码。为了便于阅读,我将线分开,实际代码正常在一行上。它使用union all将列名放在文件的顶部。

bcp 
"select
    'MRN'
    ,'column name 2'
    ,[rest of the column names]
union all 
select distinct 
    iif(r.MRN is not null, cast(r.MRN as varchar), '') as MRN 
    ,[rest of the columns]
from DATA_MANAGEMENT.dbo.Daily_inpat_out as d 
left join DATA_MANAGEMENT.dbo.Roster_all_match as r 
    on d.Subscriber_ID = r.SUB_ID 
where 
    r.MO_DLGTN_STA_DESC = 'DELEGATED'" 
queryout "L:\Data_Management\Import_data\Daily_inpat\inpat_out_%mydate%_%mytime%.txt"
-c -S [servername] -U [user] -P [password] -t "|"

这里是汉字输出的第一部分,完整的字符串要长得多:

前籎潇瑶偟潲牧浡䝼偒䥟籄䕍䉍剅也䵁籅䥂呒彈䅄䕔卼扵捳楲敢彲䑉呼彘䕓呔义彇䕄䍓

编辑添加:

如评论中所述,问题出现在记事本中,但在其他应用程序(Word,Excel,Notepad ++)中正确显示,因此这是一个编码问题。我仍然希望了解问题的原因以及如何解决问题。

1 个答案:

答案 0 :(得分:3)

这是由文本文件前面的巧合字节排列引起的,这使得记事本相信数据实际上是一个Unicode双字节文本文件。从理论上讲,你可以放置一组字符来说服解析器数据实际上是ASCII,但这会改变输出的格式。

按照易于实施的顺序,你最好的赌注是:

  • 在每行的前面添加一个或两个空格[不保证]
  • 使用其他程序查看输出
  • 以HTML格式输出数据,并使用浏览器进行查看
  • 按原样输出,并使用应用程序将其转换为.pdf文件
  • 使用报告应用程序生成输出文件

使用记事本查看文本文件时,无法保证可以防止这种情况发生。您可以做的最好是尽量减少问题,或者使用不同的格式进行最终输出。