bcp 命令输出汉字而不是 table
bcp command outputting Chinese characters instead of table
我有一个批处理文件,它使用 BCP
将带分隔符的文本文件导入 SQL 服务器,使用 SQLCMD
运行一些处理,然后通过 [=13] 输出处理后的数据=].它目前给出的是一串中文字符,而不是分隔文本 table。奇怪的是它在两天前就开始工作了,而我没有做任何改变。
我已确认输入 BCP 和 SQL 服务器处理步骤有效;保存输出数据的 SQL 服务器 table 是正确的。我还尝试使用 -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++)中显示正确,因此这是一个编码问题。我仍然希望了解问题的原因以及解决方法。
这是由于文本文件前面字节的巧合排列导致记事本认为数据实际上是 Unicode 双字节文本文件。理论上,您可以在那里放置一组字符,让解析器相信数据实际上是 ASCII,但这会改变输出的格式。
您最好的选择是,按照易于实施的顺序:
- 在每行的前面添加一个或两个空格[不保证]
- 使用不同的程序查看输出
- 将数据输出为HTML,并使用浏览器查看
- 按原样获取输出,并使用应用程序将其制作成 .pdf 文件
- 使用报告应用程序生成输出文件
无法保证在使用记事本查看文本文件时防止这种情况发生。你能做的最好的事情就是尽量减少问题,或者为最终输出使用不同的格式。
我遇到了同样的问题(数据集之间也有一个联合)但是正在构建我的 SQL 语句
在我的例子中,我为没有数据的已知列选择了 '' as SomeField
,在顶部 table 满足并集。
我改为NULL as SomeField
,并将我的isnull检查改为ISNULL(field,char(32))
SET @SQL = @SQL +'ISNULL('+@Cols+ ',CHAR(32))' + ' as '+@Cols+','
bcp 输出文件是正确的。
我怀疑在上述情况下是
iif(r.MRN is not null, cast(r.MRN as varchar), '') as MRN
这可能是导致编码问题的原因
iif(r.MRN is not null, cast(r.MRN as varchar), CHAR(32)) as MRN
本来可以解决这个问题的。
我有一个批处理文件,它使用 BCP
将带分隔符的文本文件导入 SQL 服务器,使用 SQLCMD
运行一些处理,然后通过 [=13] 输出处理后的数据=].它目前给出的是一串中文字符,而不是分隔文本 table。奇怪的是它在两天前就开始工作了,而我没有做任何改变。
我已确认输入 BCP 和 SQL 服务器处理步骤有效;保存输出数据的 SQL 服务器 table 是正确的。我还尝试使用 -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++)中显示正确,因此这是一个编码问题。我仍然希望了解问题的原因以及解决方法。
这是由于文本文件前面字节的巧合排列导致记事本认为数据实际上是 Unicode 双字节文本文件。理论上,您可以在那里放置一组字符,让解析器相信数据实际上是 ASCII,但这会改变输出的格式。
您最好的选择是,按照易于实施的顺序:
- 在每行的前面添加一个或两个空格[不保证]
- 使用不同的程序查看输出
- 将数据输出为HTML,并使用浏览器查看
- 按原样获取输出,并使用应用程序将其制作成 .pdf 文件
- 使用报告应用程序生成输出文件
无法保证在使用记事本查看文本文件时防止这种情况发生。你能做的最好的事情就是尽量减少问题,或者为最终输出使用不同的格式。
我遇到了同样的问题(数据集之间也有一个联合)但是正在构建我的 SQL 语句
在我的例子中,我为没有数据的已知列选择了 '' as SomeField
,在顶部 table 满足并集。
我改为NULL as SomeField
,并将我的isnull检查改为ISNULL(field,char(32))
SET @SQL = @SQL +'ISNULL('+@Cols+ ',CHAR(32))' + ' as '+@Cols+','
bcp 输出文件是正确的。
我怀疑在上述情况下是
iif(r.MRN is not null, cast(r.MRN as varchar), '') as MRN
这可能是导致编码问题的原因
iif(r.MRN is not null, cast(r.MRN as varchar), CHAR(32)) as MRN
本来可以解决这个问题的。