0

我得到了一个我需要读入 SQL 表的 CSV。现在它是通过 Web 应用程序手动上传的,但我想将它移动到 SQL 服务器中。我不想将我的导入脚本直接移植到 SSIS 中的脚本中,而是想检查一下是否有更好的方法来做到这一点。

这个特定 CSV 的问题是前几列是已知的,并且具有适当的标题。但是,在该组之后,其余列的填充很少,甚至可能没有标题。

例子:

Col1,Col2,Col3,,,,,,
value1,value2,value3,,value4
value1,value2,value3,value4,value5
value1,value2,value3,,value4,value5
value1,value2,value3,,,value4

使这种情况可以容忍的是 Col3 之后的所有内容都可以连接在一起。该脚本检查每一行的这些尾随列,并将它们放在一起进入“杂项”列。它必须以一种盲目的方法来执行此操作,因为无法提前知道其中有多少列。

有没有办法使用 SSIS 工具来做到这一点,或者我应该将现有的导入脚本移植到 SSIS 脚本任务?

4

2 回答 2

0

SSIS 之外的另一个选择是将 BulkInsert 与格式文件一起使用。

格式文件允许您描述传入数据的格式。

例如..

9.0
4
1       SQLCHAR       0       100     ","      1     Header1      SQL_Latin1_General_CP1_CI_AS
2       SQLCHAR       0       100     ","      2     Header2      SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR       0       100     ","      3     Header3      SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR       0       100     "\r\n"   4     Misc         SQL_Latin1_General_CP1_CI_AS

批量插入>> http://msdn.microsoft.com/en-us/library/ms188365.aspx

格式化文件 >> http://msdn.microsoft.com/en-us/library/ms178129.aspx

于 2013-02-02T01:10:06.343 回答
0

步骤 0. 我的测试文件加上一行

Col1,Col2,Col3,,,,,,
value1,value2,value3,,value4
value1,value2,value3,value4,value5
value1,value2,value3,,value4,value5
value1,value2,value3,,,value4
ends,with,comma,,,value4,
  1. 在控制流表面上拖动 DFT
  2. 在 DFT 内部,在数据流表面上,拖动平面文件源
  3. 让我们从地图本身开始。检查第一个数据行中的列名。
  4. 您将看到 Col1、Col2、Col3,它们是您已知的字段。
  5. 您还将看到第 3 列到第 8 列。这些列需要合并到一个 Misc 列中。

  6. 转到平面文件管理器编辑器的高级部分。

  7. 将第 3 列重命名为 Misc。将字段大小设置为 4000。

    注意:更长的时间,您需要使用文本数据类型。这会带来一些挑战,所以准备好好玩吧 ;-)

  8. 删除第 4 到 8 列。现在添加一个脚本组件。输入列 - 仅选择杂项字段。使用类型:读写代码:

公共覆盖 void Input0_ProcessInputRow(Input0Buffer Row)

    {
        string sMisc = Row.Misc;


        string sManipulated = string.Empty;
        string temp = string.Empty;

        string[] values = sMisc.Split(',');

        foreach (string value in values)
        {
            temp = value;

            if (temp.Trim().Equals(string.Empty))
            {
                temp = "NA";
            }

            sManipulated = string.Format("{0},{1}", sManipulated, temp);
        }

        Row.Misc = sManipulated.Substring(1); 
    }

- 目的地。和平时没什么不同。

希望我已经了解您的问题并且解决方案对您有用。

于 2013-02-02T04:52:42.903 回答