exec xp_cmdshell 把查询结果存附件,中文乱码

lusawlx 2016-05-18 11:11:51
exec xp_cmdshell 'sqlcmd -E -s , -Q "SET LANGUAGE ''Simplified Chinese'' set nocount on select SUBSTRING(''BMC103 CC40 ''+REPLACE(CONVERT(varchar(10),ddate,23),''-'','''')+emp_code+'' ''+replace(ctime,'':'','''')+in_out+'' ''+case term_no when ''101'' then N''大门'' when ''104'' then N''中门'' else N''天桥'' end+''(''+in_out+'')'',1,92) from card_skzl where CONVERT(varchar(10),ddate,23)=''2016-01-25''" -o D:\wlx.txt'


这样导出来,大门 ,中门,天桥,都变成问号了,直接数据里查询出结果是不会乱码来的

这种情况应该怎么解决???/











...全文
234 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2016-05-20
  • 打赏
  • 举报
回复
联机上有说明,你这样用没问题,用-N/-n/-w处理unicode字符串
lusawlx 2016-05-19
  • 打赏
  • 举报
回复
引用 7 楼 lusawlx 的回复:
create table ##jh(re nvarchar(4000)) insert ##jh select SUBSTRING('BMC103 CC40 '+REPLACE(CONVERT(varchar(10),ddate,23),'-','')+emp_code+' '+replace(ctime,':','')+in_out+' '+case term_no when '101' then N'大门' when '104' then N'中门' else N'天桥' end+'('+in_out+')',1,92) from card_skzl where CONVERT(varchar(10),ddate,23)='2016-01-25' exec master..xp_cmdshell 'bcp ##jh out "d:\wlx.txt" /P"" -T -CACP -w' drop table ##jh 这样就不会乱码了,但不知 nvarchar(4000)够不够 用,得定义多少合适
真的是一孕笨三年,那样就可以了,,,, 定义的是字段长段,怎么突然想成表的容量
lusawlx 2016-05-19
  • 打赏
  • 举报
回复
create table ##jh(re nvarchar(4000)) insert ##jh select SUBSTRING('BMC103 CC40 '+REPLACE(CONVERT(varchar(10),ddate,23),'-','')+emp_code+' '+replace(ctime,':','')+in_out+' '+case term_no when '101' then N'大门' when '104' then N'中门' else N'天桥' end+'('+in_out+')',1,92) from card_skzl where CONVERT(varchar(10),ddate,23)='2016-01-25' exec master..xp_cmdshell 'bcp ##jh out "d:\wlx.txt" /P"" -T -CACP -w' drop table ##jh 这样就不会乱码了,但不知 nvarchar(4000)够不够 用,得定义多少合适
lusawlx 2016-05-19
  • 打赏
  • 举报
回复
引用 5 楼 roy_88 的回复:
可尝试用 bcp 导出加 -N 命令 用法参照: http://bbs.csdn.net/topics/391949977
exec xp_cmdshell 'bcp "SET LANGUAGE ''Simplified Chinese'' set nocount on select SUBSTRING(''BMC103 CC40 ''+REPLACE(CONVERT(varchar(10),ddate,23),''-'','''')+emp_code+'' ''+replace(ctime,'':'','''')+in_out+'' ''+case term_no when ''101'' then N''大门'' when ''104'' then N''中门'' else N''天桥'' end+''(''+in_out+'')'',1,92) from card_skzl where CONVERT(varchar(10),ddate,23)=''2016-01-25''" queryout D:\wlx.txt -c -T -S localhost' 出来是这样,跟用sqlcmd一样,中文变乱码 BMC103 CC40 2016012521281040 223047I ??(I) 加-N是加在哪? -T后面吗,我加后试一下更怪 ¨ B M C 1 0 3 C C 4 0 2 0 1 6 0 1 2 5 2 1 2 8 1 0 4 0 2 2 3 0 4 7 I ? ? ( I )
lusawlx 2016-05-18
  • 打赏
  • 举报
回复
引用 3 楼 roy_88 的回复:
用以下方法看看类型显示为varchar还是 nvarchar? 如果是nvarchar,用-u那显示是应该正常,如果是varchar那强制转换类型再输出
SET LANGUAGE 'Simplified Chinese';
SET NOCOUNT ON;
SELECT  SQL_VARIANT_PROPERTY(SUBSTRING(N'BMC103              CC40           '
                  + REPLACE(CONVERT(VARCHAR(10), ddate, 23), '-', '')
                  + emp_code + '            ' + REPLACE(ctime, ':', '')
                  + in_out + '         ' + CASE term_no
                                             WHEN '101' THEN N'大门'
                                             WHEN '104' THEN N'中门'
                                             ELSE N'天桥'
                                           END + '(' + in_out + ')', 1, 92),'BaseType')
FROM    card_skzl
WHERE   CONVERT(VARCHAR(10), ddate, 23) = '2016-01-25'
出来是nvarchar,但是用-u后还是问号啊
中国风 2016-05-18
  • 打赏
  • 举报
回复
用以下方法看看类型显示为varchar还是 nvarchar? 如果是nvarchar,用-u那显示是应该正常,如果是varchar那强制转换类型再输出
SET LANGUAGE 'Simplified Chinese';
SET NOCOUNT ON;
SELECT  SQL_VARIANT_PROPERTY(SUBSTRING(N'BMC103              CC40           '
                  + REPLACE(CONVERT(VARCHAR(10), ddate, 23), '-', '')
                  + emp_code + '            ' + REPLACE(ctime, ':', '')
                  + in_out + '         ' + CASE term_no
                                             WHEN '101' THEN N'大门'
                                             WHEN '104' THEN N'中门'
                                             ELSE N'天桥'
                                           END + '(' + in_out + ')', 1, 92),'BaseType')
FROM    card_skzl
WHERE   CONVERT(VARCHAR(10), ddate, 23) = '2016-01-25'
lusawlx 2016-05-18
  • 打赏
  • 举报
回复
引用 1 楼 roy_88 的回复:
加个 -u 试试 -u -o D:\wlx.txt
加了还是问号?
中国风 2016-05-18
  • 打赏
  • 举报
回复
加个 -u 试试 -u -o D:\wlx.txt
中国风 2016-05-18
  • 打赏
  • 举报
回复
可尝试用 bcp 导出加 -N 命令 用法参照: http://bbs.csdn.net/topics/391949977

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧