日期:2014-05-18  浏览次数:20432 次

用代码实现BCP的导出功能时出现乱码
环境:
        1.Winxp   sp2   en
        2   .SQL   2K5   Dev   en
目的:使用代码实现使用BCP导出表至文本文件
运行情况:   导出的文本内,本来应该是中文的,现在都是乱码,但是奇怪的是,我把乱码的文本再导入到数据库里,却发现能显示正常的中文.

***********************************************************************

我是参照邹老大的:
if   exists(select   1   from   sysobjects   where   name= 'File2Table '   and   objectproperty(id, 'IsProcedure ')=1)
  drop   procedure   File2Table
go

/*--实现数据导入/导出的存储过程

  可以实现导入/导出   整个数据库/指定表   到文本文件

--邹建   2003.07(引用请保留此信息)--*/

/*--调用示例

  --导出指定表
  exec   file2table   @tbname=N 'jobs,pub_info ',@filename= 'c:\[@tbname].txt '

  --导出所有表
  exec   file2table   @filename= 'c:\[@dbname]_[@tbname].txt '

  --导入所有表
  exec   file2table   @filename= 'c:\[@dbname]_[@tbname].txt ',@isout=0
--*/
create   procedure   File2Table
@tbname   nvarchar(4000)= ' ',       --表名列表,如果不指定,则表示所有用户表
@filename   nvarchar(1000)= ' ',   --导出的文件名,如果不指定,导出到SQL   Server的默认备份目录\[@dbname]_[@tbname].txt,其中[@dbname]在处理中会替换为数据库名,[@dbname]会用表名代替
@isout   bit=1,                                 --1为导出(默认),0为导入
@username   sysname= ' ',                 --用户名,如果sql不允许使用NT验证方式登录,则必须指定
@password   sysname= ' ',                 --密码
@code   char(1)=N 'N '                       --文件编码,可以是n,c,N,W,作用参考bcp语法(如果是数据传输需要,建议用N)
as
declare   @s   nvarchar(4000)

if   isnull(@code,N ' ')   not   in(N 'n ',N 'c ',N 'N ',N 'W ')
  set   @code= 'N '

--备份文件名
if   isnull(@filename,N ' ')=N ' '
begin
  select   top   1   @filename=rtrim(reverse(filename))  
  from   master.dbo.sysfiles  
  where   name=N 'master '
  select   @filename=stuff(@filename,1,charindex( '\ ',@filename),N ' ')
    ,@filename=reverse(stuff(@filename,1,charindex( '\ ',@filename),N ' '))
    +N '\BACKUP\ '+db_name()+N '_[@tbname].txt '
end
else
  set   @filename=replace(@filename,N '[@dbname] ',db_name())

declare   tb   cursor   local
for
select   N 'bcp   " '+db_name()
  +N '. '+quotename(user_name(uid))
  +N '. '+quotename(name)
  +N ' " '
  +case   when   @isout=1   then   N '   out '   else   N '   in '   end
  +N '   " '
  +replace(@filename,N '[@tbname] ',name)
  +N ' "   / '+@code
  +case   when   isnull(@username,N ' ')=N ' '   then   N '   /T '
    else   N '   /U " '+@username
+N ' "   /P " '+isnull(@password,N ' ')+N ' " '+N '