SSIS平面文件导出在CRLF期间添加额外字符

时间:2014-07-17 19:10:18

标签: sql sql-server sql-server-2008 ssis newline

我使用SQL Server 2008 R2和VS 2008在Windows中工作。

我无法通过谷歌找到任何其他发生的事件,但我遇到SSIS无法识别我的SQL查询中的CRLF代码的问题。问题有两个:

  1. 在记事本中,平面文件不会出现在列中。它是 只有一长串文本(虽然这可以在记事本++中解决)。

  2. 在notepad ++中查看时,第一行数据缩进 两个字符和每个后续行进一步缩进! 基本上这个文件在另一端是不可读的。

  3. 以下是我正在接近它的示例:

    Select col1, col2, col3, char(13)+char(10) CRLF
    

    产生如下数据:

    Col1    Col2    Col3    CRLF
      xxxx    xxxx    xxxx    
         xxxx    xxxx    xxxx  
         xxxx    xxxx    xxxx
    

    我尝试过的其他事情包括:

    1. 使用declare @crlf(返回相同的结果)

    2. 仅使用char(13)或仅使用char(10)(返回相同的结果)

    3. 使用Col3+char(13)+char(10)(以单行返回结果)

    4. 我想我在这里只缺少一小部分谜题,但我无法弄清楚那件作品会是什么。非常感谢您的帮助。


      在此处输入一些请求的屏幕截图: General Settings

      Column Settings 你可以在这里看到额外角色开始潜入的地方。

2 个答案:

答案 0 :(得分:0)

我使用你列出的完全相同的dev堆栈,我没有在SQL查询中包含CRLF,我只使用SSIS输出连接中的行分隔符。

在SSIS包中,编辑输出连接。它显示平面文件连接管理器。在“列”选项卡中(好吧,不是一个选项卡,但是从左侧列表中选择列),这里是一个“行分隔符”,我在那里指定了我的CRLF。

“常规”选项卡上还有一个“标题行分隔符”,但这仅适用于标题行。

除非您有理由在查询行中间嵌入换行符?

编辑:更多疑难解答问题...... 1)您是将文件写入网络驱动器还是本地驱动器?如果正在进行任何自动映射,请尝试设置为本地驱动器。

2)您的数据来源是什么?我通常使用OLEDB源,但如果遇到问题,可以尝试使用平面文件输入源,看看它是否可以模拟简单输出的简单输入。

3)你是如何得到你的文件看的?您是否登录到服务器并在那里使用记事本?如果没有,请尝试查看在查看文件时是否发生问题。

4)数据中是否有可能干扰的特殊字符?尝试返回一些常量的查询。

编辑2:我看到了你的评论,我会将我的一个切换到固定宽度并很快回复你 - 你是否检查过你的宽度是否太短并且剪切了终止字符?

编辑3: 我今晚必须去,我明天再看看这件事,然后回到你身边,清理我凌乱乱糟糟的帖子。我做了一个我试图尽可能地匹配你的包裹,但我开始使用现有的一个副本而不是一个新的开始,它陷入了一个半生不熟的状态。我明天会从头开始做一个新的。

BTW,你的所有行都是相同的宽度吗?如果没有,你尝试过Ragged Right而不是Fixed Width吗?

编辑4:添加更多...... 在周末我继续玩这个并注意到你可以让SSIS为你添加行分隔符。首次创建平面文件目标并对其进行编辑时,可以选择创建新的平面文件连接管理器,其中一个选项是添加一个包含CRLF的列。不幸的是,如果在输出文件中包含列名,则会产生令人烦恼的副作用,即始终包含“行分隔符列”的标题。您可以通过指定标题行而不是从字段名称构建它来绕过它,但是在SQL语句中附加CRLF可能要少得多。

IMGUR image of Flat File connection creation with row delimiter option

对于继续玩这个的人来说,使用分隔的平面文件但在数据转换(Derived Column)或SQL查询中强制字段固定长度也有效,但更复杂。在Derived Column转换中,我用SUBSTRING(Nums + REPLICATE(“”,4),1,4)替换了我的输入列(Nums),其中4是字段宽度。为了在SQL查询中执行相同的操作,我使用CONVERT(CHAR(4),Nums)作为Nums。

答案 1 :(得分:0)

在Flat File Connection Manager的“高级”选项卡上,可能未正确设置InputColumnWidth。我猜到了包含CRLF的最后一列,它应该是2长。