如何使SQLSERVER2008输出UTF-8的XML文件

mingrui99 2011-07-10 07:10:31
初次使用XML,在Sql Server2008中写了一段代码可以生成如下的XML文件,但是文件头的标识却不包含'<?xml version="1.0" encoding="UTF-8"?>',请教各位要怎么处理?
declare @xml varchar(max)
declare @barcode varchar(100)
declare @actor varchar(100)
declare @actdate datetime
declare @wrongcode varchar(100)
declare @tocorpid varchar(100)
declare @ownerid varchar(100)
declare @corporderid varchar(100)
declare @ordno varchar(100)
declare @itmno varchar(100)
declare @x xml
declare @title varchar(1000)
declare @title1 varchar(3000)
declare @tkdat varchar(100)
declare @custom varchar(100)
declare @xml1 xml
--set codepage = 65001
set @custom='LAP001'
set @xml='<?xml version="1.0" encoding="UTF-8"?>'
set @xml=@xml+'<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="3.0">'
set @xml=@xml+'<Events><Event name="SalesWareHouseOut" MainAction="WareHouseOut"><DataField>'
declare cu_barcode cursor for
select b.ORDNO,b.itmno,b.BAR_CODE,b.UP_DATE,a.custom
from LOG_ERP_OUT a , barcodeitem b
where a.ID=b.Erpout_id and a.custom=@custom
open cu_barcode
fetch next from cu_barcode into @ordno,@itmno,@barcode,@actdate,@custom
while @@FETCH_STATUS=0
begin
set @tkdat=CONVERT(varchar(12) , getdate(), 112 )
set @xml=@xml+'<Data Code="'+@barcode+'" Actor="0001" Actdate="'+@tkdat+'" WrongCode="False" TOCorpID="'+@custom+'" OwnerID="" CorpOrderID="Out_'+@ordno+'"/>'
fetch next from cu_barcode into @ordno,@itmno,@barcode,@actdate,@custom
end
set @xml=@xml+'</DataField></Event></Events></Document>'
set @custom='out_'+@custom
delete log_xml where custom=@custom
insert into log_xml(xml,custom)
values(@xml,@custom)
select @xml1=(select xml from log_xml where custom=@custom for xml auto)
delete tt
insert tt(aa)values(@xml1)
set @title1=@custom
set @title1='bcp data_anyang..tt out c:/xml/'+@title1+'.xml -c -T -k'
exec master..xp_cmdshell @title1
CLOSE cu_barcode
DEALLOCATE cu_barcode

生成的文件如下:
<log_x005F_xml>
- <xml>
- <Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="3.0">
- <Events>
- <Event name="SalesWareHouseOut" MainAction="WareHouseOut">
- <DataField>
<Data Code="10101010101010101010" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
<Data Code="11011011011011011011" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
<Data Code="11111111111111111111" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
<Data Code="12012012012012012012" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
<Data Code="13013013013013013013" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
<Data Code="14014014014014014014" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
<Data Code="22222222222222222222" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
<Data Code="33333333333333333333" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
<Data Code="44444444444444444444" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
<Data Code="55555555555555555555" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
<Data Code="66666666666666666666" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
<Data Code="77777777777777777777" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
<Data Code="88888888888888888888" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
<Data Code="99999999999999999999" Actor="0001" Actdate="20110709" WrongCode="False" TOCorpID="LAP001" OwnerID="" CorpOrderID="Out_20110528001" />
</DataField>
</Event>
</Events>
</Document>
</xml>
</log_x005F_xml>

谢谢各位了
...全文
325 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
少说绝对 2011-07-26
  • 打赏
  • 举报
回复
问题解决:用path 就可以了。
少说绝对 2011-07-26
  • 打赏
  • 举报
回复
_x005F为什么会出现这个乱码呢,发现_x就会在前面出现这个乱码。
唐诗三百首 2011-07-11
  • 打赏
  • 举报
回复
套用一下..

--建测试表
create table xtab (xx varchar(max))

--加文件头
insert into xtab values('<?xml version="1.0" encoding="UTF-8" ?>')
insert into xtab values('<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="3.0">')
insert into xtab values('<Events><Event name="SalesWareHouseOut" MainAction="WareHouseOut"><DataField>')

--加文件内容(<Data Code>XML)
insert into xtab select '<Data Code="81113380000020861666" Actor="0001" Actdate="2011-04-21 16:51:00" WrongCode="False" TOCorpID="000002929220" OwnerID="" CorpOrderID="Out_20110421165100" /> '

--加文件尾
insert into xtab values('</DataField></Event></Events></Document>')

--导出为XML文件
exec master..xp_cmdshell 'bcp mydb.dbo.xtab out c:/0710.xml -c -T -k'

mingrui99 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ap0405140 的回复:]
引用 5 楼 mingrui99 的回复:
这个好像不行的,用的是VARCHAR(MAX),保存出来的XML文件无法用IE打开,提示文件的顶层无效

我只是给个例子,说明可以很自由的定义XML格式.
具体的XML要什么格式要参照来修改的呀.
[/Quote]

还是很疑惑。。。我希望得到的是下面的结果
<?xml version="1.0" encoding="UTF-8" ?> 
- <Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="3.0">
- <Events>
- <Event name="SalesWareHouseOut" MainAction="WareHouseOut">
- <DataField>
<Data Code="81113380000020861666" Actor="0001" Actdate="2011-04-21 16:51:00" WrongCode="False" TOCorpID="000002929220" OwnerID="" CorpOrderID="Out_20110421165100" />
</DataField>
</Event>
</Events>
</Document>
唐诗三百首 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mingrui99 的回复:]
这个好像不行的,用的是VARCHAR(MAX),保存出来的XML文件无法用IE打开,提示文件的顶层无效
[/Quote]
我只是给个例子,说明可以很自由的定义XML格式.
具体的XML要什么格式要参照来修改的呀.
mingrui99 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 fredrickhu 的回复:]
SQL code
/*--存为XML
将表/查询存储为标准的XML文件
--邹建 2003.12(引用请保留此信息)--*/

/*--调用示例
--用SQL用winows身份验证的情况
exec p_savexml @sql='地区资料',@fname='c:\地区资料.xml'

--用指定的用户
exec p_savexml @sql='地区资料',@fname……
[/Quote]
我用您的程序试了一下,生成的类似于如下的XML文件,还不是我要的结果。。。继续等
- <xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
- <s:Schema id="RowsetSchema">
- <s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">
- <s:AttributeType name="bar_code" rs:number="1" rs:writeunknown="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="100" rs:maybenull="false" />
</s:AttributeType>
<s:extends type="rs:rowbase" />
</s:ElementType>
</s:Schema>
- <rs:data>
<z:row bar_code="10101010101010101010" />
<z:row bar_code="11011011011011011011" />
<z:row bar_code="11111111111111111111" />
<z:row bar_code="12012012012012012012" />
<z:row bar_code="13013013013013013013" />
<z:row bar_code="14014014014014014014" />
<z:row bar_code="22222222222222222222" />
<z:row bar_code="33333333333333333333" />
<z:row bar_code="44444444444444444444" />
<z:row bar_code="55555555555555555555" />
<z:row bar_code="66666666666666666666" />
<z:row bar_code="77777777777777777777" />
<z:row bar_code="88888888888888888888" />
<z:row bar_code="99999999999999999999" />
</rs:data>
</xml>
mingrui99 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ap0405140 的回复:]
代码如下供参考,最近刚好在做XML的程序.

SQL code

--建测试表
create table xtab (xx varchar(max))

--加文件头
insert into xtab values('<?xml version="1.0" encoding="UTF-8"?>')
insert into xtab values('<xmlcode>')

-……
[/Quote]

这个好像不行的,用的是VARCHAR(MAX),保存出来的XML文件无法用IE打开,提示文件的顶层无效
mingrui99 2011-07-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ap0405140 的回复:]
套用一下..

SQL code

--建测试表
create table xtab (xx varchar(max))

--加文件头
insert into xtab values('<?xml version="1.0" encoding="UTF-8" ?>')
insert into xtab values('<Document xmlns:xsi="http://ww……
[/Quote]

非常感谢!!!我已经成功了!!!
lao_bulls 2011-07-10
  • 打赏
  • 举报
回复
这个要顶。
唐诗三百首 2011-07-10
  • 打赏
  • 举报
回复
代码如下供参考,最近刚好在做XML的程序.

--建测试表
create table xtab (xx varchar(max))

--加文件头
insert into xtab values('<?xml version="1.0" encoding="UTF-8"?>')
insert into xtab values('<xmlcode>')

--加文件内容(XML)
declare @x xml
set @x=(select name,xtype from sysobjects for xml auto)
insert into xtab select cast(@x as varchar(max))

--加文件尾
insert into xtab values('</xmlcode>')

select * from xtab

--导出为XML文件
exec master..xp_cmdshell 'bcp mydb.dbo.xtab out c:/0710.xml -c -T -k'

-- 结果 c:/0710.xml
--<?xml version="1.0" encoding="UTF-8"?>
--<xmlcode>
--....
--</xmlcode>


--小F-- 2011-07-10
  • 打赏
  • 举报
回复
/*--存为XML
将表/查询存储为标准的XML文件
--邹建 2003.12(引用请保留此信息)--*/

/*--调用示例
--用SQL用winows身份验证的情况
exec p_savexml @sql='地区资料',@fname='c:\地区资料.xml'

--用指定的用户
exec p_savexml @sql='地区资料',@fname='c:\地区资料.xml',@userid='sa'
--*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_savexml]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_savexml]
GO

create proc p_savexml
@sql varchar(8000), --要保存的表/视图/SQL查询语句
@fname varchar(1000)='c:\tmp.xml', --保存的XML文件名
@userid varchar(50)='', --用户名,如果为nt验证方式,则为''
@password varchar(50)='' --密码
as
declare @err int,@src varchar(255),@desc varchar(255)
declare @obj int,@constr varchar(1000)
if isnull(@userid,'')=''
set @constr='Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog='
+db_name()+';Data Source='+@@servername
else
set @constr='Provider=SQLOLEDB.1;Persist Security Info=True;'
+'User ID='+@userid+';Password='+isnull(@password,'')
+';Initial Catalog='+db_name()+';Data Source='+@@servername

exec @err=sp_oacreate 'adodb.recordset',@obj out
if @err<>0 goto lberr

exec @err=sp_oamethod @obj,'open',null,@sql,@constr
if @err<>0 goto lberr

set @sql='del '+@fname
exec master..xp_cmdshell @sql,no_output
exec @err=sp_oamethod @obj,'save',null,@fname,1
if @err<>0 goto lberr

exec @err=sp_oadestroy @obj
return

lberr:
exec sp_oageterrorinfo 0,@src out,@desc out
select cast(@err as varbinary(4)) as 错误号
,@src as 错误源,@desc as 错误描述
go




本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zjcxc/archive/2003/12/31/20086.aspx
mingrui99 2011-07-10
  • 打赏
  • 举报
回复
顶一下,再注明,生成的XML文件中不需要
<log_x005F_xml><xml>
</xml></log_x005F_xml>
,需要在头加上
'<?xml version="1.0" encoding="UTF-8"?>'

22,209

社区成员

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

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