【问题标题】:Using bcp to extract xml result, but output file has newline characters使用 bcp 提取 xml 结果,但输出文件有换行符
【发布时间】:2014-12-08 23:11:05
【问题描述】:

我有这段 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 确实阻止了换行符,但是所有字符都被空分隔。

【问题讨论】:

    标签: sql-server xml stored-procedures bcp


    【解决方案1】:

    TYPE 子句添加到您的FOR XML 语句中,并在导出XML 时使用bcp-w 开关。您还可以通过在 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'
    

    【讨论】:

    • 欢迎来到 Stack Overflow!我冒昧地对您的帖子进行格式化以利用语法突出显示。
    【解决方案2】:

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

    我在 bcp 输出中添加了 -r 选项。

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      相关资源
      最近更新 更多