我需要从存储过程中读取一个大的xml结果(使用For XML)并将其写入.Net应用程序中的文件。我的第一个镜头是使用XmlReader从proc中读取xml。然后我需要将其写入文件。这是处理这种情况的最佳方法,还是有“更好”的方法?
答案 0 :(得分:1)
如果这可能更方便,您也可以使用bcp和cmdshell直接从存储过程将xml写入文件,如下例所示:
DECLARE @exe nvarchar(1000)
SET @exe =N'bcp '
SET @exe =@exe + N'"SELECT id, Color FROM Tinker.dbo.myTable AS myTable FOR XML AUTO" '
SET @exe =@exe + N'queryout E:\DB\Colors.xml -c -T'
EXEC master..xp_cmdshell @exe
为此,您需要 xp_cmdshell enabled ,同时确保SQL Server服务有权写入目录。
答案 1 :(得分:0)
你正在做我想做的事。
答案 2 :(得分:0)
正如您所发现的那样,.Net中的Reader系列API在复制语义方面表现不佳。要复制XML Reader,您必须逐个节点地执行此操作,这很慢并且非常容易出错。
我会说,更好的替代方案是使用原始流,而不是读者。 Streams具有缓冲区byte[]
Read和Write语义,允许进行简单复制。要从ADO.Net获取正确的流,您必须使用ExecuteReader并且必须传入CommandBehavior.SequentialAccess,以便数据读取器不会缓存您的200Mb文档,和你必须将感兴趣的领域作为具有流语义的SqlClient类型之一,其中没有很多:SqlBytes.Stream。