我有这段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
确实阻止了新行,但所有字符都以空值分隔。
答案 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");
});
})