【问题标题】:how to check column structure in ssis?如何检查ssis中的列结构?
【发布时间】:2019-04-05 09:37:58
【问题描述】:

我的 sql server 中有一个表 customer。

  1. Distributor_Code
  2. 客户代码
  3. 客户名称
  4. cust_add
  5. 压缩包
  6. 电话
  7. dl_number
  8. gstin

我们每月都会从经销商处收到客户文件。 所以有时他们会发送带有错误结构的文件.. 比如可能缺少 gstin 或缺少 dl_number 或 gstin 代替 dl_number 并且 dl_number 代替 tel...基本上,列可能会被拆分..

当我们使用 SSIS 上传这些平面文件时,它会报错。如果结构错误,数据不会上传到服务器上。

如果缺少列或列错位,我想上传这些带有空数据的数据。

【问题讨论】:

  • “我们收到客户文件” - 什么样的文件?这些文件是否说明了它们提供的值?
  • 文件是平面文件,由管道“|”分隔符分隔
  • 您在文件本身中是否有任何关于缺少哪些列的指示?一个文件可以包含多行,每行缺少不同的列吗?

标签: sql sql-server ssis etl ssis-2012


【解决方案1】:

解决方案

根据您的评论,您正在处理平面文件。要解决此问题,您必须将所有列作为一列读取并随时检索结构。

详情

  1. 首先添加平面文件连接管理器。
  2. 在平面文件连接管理器中,转到“高级”选项卡,删除所有列并仅保留一列(Column0)
  3. 将列类型更改为 DT_WSTR,将长度更改为 4000。
  4. 添加Dataflow task
  5. Dataflow task 内添加平面文件源、脚本组件和 OLEDB 目标。
  6. 打开脚本组件,进入输入/输出选项卡并添加 8 个输出列(Distriber_Code,Cust_code,cust_name,cust_add,zip,tel,dl_number,gstin)
  7. 将脚本语言更改为 Visual Basic。
  8. 在脚本里面写下如下代码。

    Dim Distributer_Code as integer = -1
    Dim Cust_code as integer = -1
    Dim cust_name as integer = -1
    Dim cust_add as integer = -1
    Dim zip as integer = -1
    Dim tel as integer = -1
    Dim dl_number as integer = -1
    Dim gstin as integer = -1
    Dim intRowIndex as integer = 0
    
    Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
    
        If intRowIndex = 0 then
    
            Dim strfields() as string = Row.Column0.split(CChar("|"))
            Dim idx as integer = 0
    
            For idx = 0 To strFields.length - 1
    
                Select case str
    
                Case "Distributer_Code"
                    Distributer_Code = idx  
                Case "Cust_code"
                    Cust_code = idx 
                Case "cust_name"
                    cust_name = idx 
                Case "cust_add"
                    cust_add = idx  
                Case "zip"
                    zip = idx   
                Case "tel"
                    tel = idx   
                Case "dl_number"
                    dl_number = idx 
                Case "gstin"
                    gstin = idx 
    
                End Select
    
            Next
    
        Else
    
            Dim strfields() as string = Row.Column0.split(CChar("|"))
    
            If Distributer_Code > -1 Then Row.DistributerCode = strfields(Distributer_Code)
            If Cust_code > -1 Then Row.Custcode = strfields(Cust_code)
            If cust_name > -1 Then Row.custname = strfields(cust_name)
            If cust_add > -1 Then Row.custadd = strfields(cust_add)
            If zip > -1 Then Row.zip = strfields(zip)
            If tel > -1 Then Row.tel = strfields(tel)
            If dl_number > -1 Then Row.dlnumber = strfields(dl_number)
            If gstin > -1 Then Row.gstin = strfields(gstin)
    
        End If
    
    
        intRowIndex += 1
    
    End Sub
    
  9. 将输出列映射到 OLEDB 目标

【讨论】:

  • 如果没有找到该列,常量是什么?即如果没有cust_add 列,那么cust_add 变量的值是多少,因此行中的值是多少?
  • @Nick.McDermaid 你是对的!代码必须改进。我今晚会这样做。谢谢
  • 很好的答案顺便说一句我永远不会考虑这样做
猜你喜欢
  • 2015-04-11
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2010-10-19
相关资源
最近更新 更多