使用bcp提取xml结果,但输出文件有换行符

时间:2014-12-08 23:11:05

标签: sql-server xml stored-procedures bcp

我有这段T-SQL

DECLARE @FileName VARCHAR(100)
DECLARE @SQLCmd   VARCHAR(500)

SELECT  @FileName = '\\ftp.myplace.com\FtpFiles\Extract.xml'

SELECT  @SQLCmd = 'bcp ' +
                  '"exec myDB.dbo.myXMLstoredProcedure"' +
                  ' queryout '  +
                  @FileName +
                  ' -w -T -S ' + @@SERVERNAME

EXECUTE master..xp_cmdshell @SQLCmd

存储过程" myXMLstoredProcedure"读取一些表并使用for xml path创建一个xml字符串。

问题是当bcp将该字符串导出到目标文件时,它会每2033个字符插入换行符(CR LF),这样就可以防止我的xml文件被解析。

有没有办法阻止bcp插入原始数据中不存在的换行符?

我已经尝试了-a 65535选项,但它没有解决它。 选项-n-N确实阻止了新行,但所有字符都以空值分隔。

2 个答案:

答案 0 :(得分:3)

TYPE子句添加到FOR XML语句中,并在导出XML时使用-w bcp开关。您还可以通过在queryout中执行存储过程而不是SQL语句(例如

)来使自己更容易
USE tempdb
GO

IF OBJECT_ID('dbo.usp_myProc') IS NOT NULL DROP PROC dbo.usp_myProc
GO

CREATE PROC dbo.usp_myProc AS

SET NOCOUNT ON

SELECT yourColumns
FROM yourTable
FOR XML AUTO, ROOT('Courses'), TYPE

RETURN
GO
EXEC xp_cmdshell 'bcp "EXEC tempdb.dbo.usp_myProc" queryout "c:\temp\Courses.xml" -S (local) -T -w'

答案 1 :(得分:3)

我在导出XML时遇到了类似的问题,并希望保留CDATA标记但每2033个字符获取一行。

我在-b选项中添加了-r选项。

-r定义了bcp输出中的换行符,所以通过添加-r而没有任何后续字符,没有新行。

FOR XML子句上的TYPE选项不是一个选项,因为它删除了CDATA标记,即使它停止了新行发生

    <div data-role="main" class="ui-content">
    <p>Age - Calculator</p>
      <br>

     <div class="ui-field-contain">
        <label>Born:</label>
        <input type="text" data-role="datebox" name="born" id="born" min="1808-04-01" max="1995-12-30"  data-options='{"mode":"flipbox"}' />
      </div>
<div class="ui-field-contain">
        <label>Died</label>
        <input type="text" data-role="datebox" name="death" id="death" min="1808-04-01" max="1995-12-30"  data-options='{"mode":"flipbox"}' />
      </div>
      <button id="btnCalc">Calculate</button>
$(document).on("pagecreate","#pagethree", function(){ 
    $("#btnCalc").on("click", function(e){
    var born = $("#born").datebox('getTheDate');
    var death = $("#death").datebox('getTheDate');
    var diff = death - born;
    var age = diff / (1000 * 60 * 60 * 24 * 365.25);
    alert("He/she was" + Math.floor(age) + " years old");  
  });
})