用代码实现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 '