--试试这个
sp_makewebtask N'D;\aa.xml',N'select * from yourtable for xml RAW'

解决方案 »

  1.   

    回复人: leimin(黄山光明顶) ( ) 信誉:290  2004-05-05 21:44:00  得分:0 
     
     
      我简单的举例了2种通过ADO调用SQL SERVER2000数据库XML的方法,不知是否满足你的要求。因为我觉得你的方法好像是绕了一个圈子,这个问题通过CLIENT段的工具会比较好实现,现在的ADO,ADO.NET都提供了很多的支持XML的函数。
    而且,通过sp_OASetProperty 的方法的效率也不是很好。我个儿一般不建议使用这个方法。
      
    我下面介绍2种方法:1.通过ADO的commandText属性来调用:
    但这个会有所限制,首先对于大容量的数据的效率不高。而且这个方式只支持UNICODE,所以,如果你的XML不是这种编码也许会出现乱码。(就是你遇到的情况)
    下面我先给出第一种代码:
    Const MSSQLXML_DIALECT = "{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"
    Const adExecuteStream = 1024
    Dim conDB 'As ADODB.Connection
    Dim cmdXML 'As ADODB.CommandSet conDB = CreateObject("ADODB.Connection")' Connect to the database using Integrated Security.
    With conDB
      .Provider = "SQLOLEDB"
      .ConnectionString = "DATA SOURCE=(local);" & _
         "INITIAL CATALOG=Northwind;" & _
         "INTEGRATED SECURITY=SSPI;"
      .Open
    End With
    Set cmdXML = CreateObject("ADODB.Command")'Assign the Connection to the Command
    Set cmdXML.ActiveConnection = conDB'Create query document
    Dim strQry 'As String
    strQry = "<Invoice xmlns:sql='urn:schemas-microsoft-com:xml-sql'>"
    strQry = strQry & "<sql:query>"
    strQry = strQry & "SELECT OrderID, OrderDate FROM Orders "
    strQry = strQry & "WHERE OrderID = 10248 FOR XML AUTO"
    strQry = strQry & "</sql:query></Invoice>"'Specify the MSSQLXML dialect and assign the query.
    cmdXML.Dialect = MSSQLXML_DIALECT
    cmdXML.CommandText = strQry'Create Stream object for results.
    Dim strmXMLOut 'AS ADODB.Stream
    Set strmXMLout = CreateObject("ADODB.Stream")'Assign the result stream.
    strmXMLout.Open
    cmdXML.Properties("Output Stream") = strmXMLout'Execute the query.
    cmdXML.Execute , , adExecuteStream'这个实例是将XML在一个消息框中,你也可以用其它方式显示.
    Dim strXML 
    strXML = Replace(strmXMLOut.ReadText,">", ">" & chr(10)+ chr(13))
    MsgBox strXML, vbInformation, "XML Invoice"
      

  2.   

    第二种方法:
    通过stream对象。SQLOLEDB PROVIDER支持command对象的commandstream属性,它可以通过stream来提交。
    CONST adExecuteStream = 1024
    CONST adWriteChar = 0
    Dim conDB 'AS ADODB.Connection
    Dim cmdXML 'AS ADODB.CommandSet conDB = CreateObject("ADODB.Connection")' Connect to the database using Integrated Security.
    With conDB
      .Provider = "SQLOLEDB"
      .ConnectionString = "DATA SOURCE=(local); INITIAL CATALOG=Northwind; INTEGRATED SECURITY=SSPI;"
      .Open
    End With
    Set cmdXML = CreateObject("ADODB.Command")'Assign the Connection object to the Command object.
    Set cmdXML.ActiveConnection = conDB'Create Stream object for inbound query.
    Dim stmXMLin 'AS ADODB.Stream
    Set stmXMLin = CreateObject("ADODB.Stream")'Create the query template.
    Dim strQry 'AS String
    strQry = "<Invoice xmlns:sql='urn:schemas-microsoft-com:xml-sql'>"
    strQry = strQry & "<sql:query>"
    strQry = strQry & "SELECT OrderID, OrderDate FROM Orders "
    strQry = strQry & "WHERE OrderID = 10248 FOR XML AUTO"
    strQry = strQry & "</sql:query></Invoice>"'Write query to inbound stream.
    stmXMLin.Open
    stmXMLin.WriteText strQry, adWriteChar'Set Stream object position to the beginning of the stream.
    stmXMLin.Position = 0'Assign Stream object to Command object.
    Set cmdXML.CommandStream = stmXMLin'Create stream for outbound result.
    Dim strmXMLout 'AS ADODB.Stream
    Set strmXMLout = CreateObject("ADODB.Stream")'Assign the result stream.
    strmXMLout.Open
    cmdXML.Properties("Output Stream") = strmXMLout'Execute the query
    cmdXML.Execute, , adExecuteStream'Process the results
    Dim strXML 'AS String
    strXML = Replace(strmXMLOut.ReadText,">", ">" & chr(10)+ chr(13))
    MsgBox strXML, vbInformation, "XML Invoice"
      

  3.   

    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/*--存为XML 将表/查询存储为标准的XML文件--邹建 2003.12(引用请保留此信息)--*//*--调用示例
    --用SQL用winows身份验证的情况
    exec p_savexml @sql='地区资料',@fname='c:\地区资料.xml' --用指定的用户
    exec p_savexml @sql='地区资料',@fname='c:\地区资料.xml',@userid='sa'
    --*/
    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='+@@servernameexec @err=sp_oacreate 'adodb.recordset',@obj out
    if @err<>0 goto lberrexec @err=sp_oamethod @obj,'open',null,@sql,@constr
    if @err<>0 goto lberrset @sql='del '+@fname
    exec master..xp_cmdshell @sql,no_output
    exec @err=sp_oamethod @obj,'save',null,@fname,1
    if @err<>0 goto lberrexec @err=sp_oadestroy @obj
    returnlberr:
    exec sp_oageterrorinfo 0,@src out,@desc out
    select cast(@err as varbinary(4)) as 错误号
    ,@src as 错误源,@desc as 错误描述
    go
      

  4.   

    因为我用的是JSP,所以前面几个方法用不上,试了一下zjcxc的最后给出的方法,但执行p_savexml存储过程后,硬盘上并没有文件产生,不知为什么?
      

  5.   

    我的方法是使用sql实现的, 存储的文件当然在sql服务器上.
      

  6.   

    原来问题出在,我在装好SQL SERVER后曾更改过主机名,所以 @@SERVERNAME 函数名并不能准备返回实例信息,而应用CONVERT(char(20), SERVERPROPERTY('servername')),对此身邹建的不严谨提出黄花牌警告一次,呵呵