Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 主机和IP混合的列上的SSI合并联接_Sql Server_Join_Merge_Ssis_Etl - Fatal编程技术网

Sql server 主机和IP混合的列上的SSI合并联接

Sql server 主机和IP混合的列上的SSI合并联接,sql-server,join,merge,ssis,etl,Sql Server,Join,Merge,Ssis,Etl,需要一些帮助,以了解合并联接操作在我的专栏中的IP地址联接时出现问题的原因 我有2个CSV文件,其中包含以下信息,加入列是ClientName,总体目标是 Array|ClientName|ResolvedClientName|Path 从我的合并加入 CSV1 CSV2 将它们都拉入并对它们执行合并联接非常简单,连接上的输出都是字符串,操作在只包含文本的连接上非常有效(server1/2/5)。然而,它的分崩离析之处在于IP地址,这似乎是由于IP地址中的“.”。在测试了这两种情况下的随机数

需要一些帮助,以了解合并联接操作在我的专栏中的IP地址联接时出现问题的原因

我有2个CSV文件,其中包含以下信息,加入列是ClientName,总体目标是

Array|ClientName|ResolvedClientName|Path 
从我的合并加入

CSV1

CSV2

将它们都拉入并对它们执行合并联接非常简单,连接上的输出都是字符串,操作在只包含文本的连接上非常有效(server1/2/5)。然而,它的分崩离析之处在于IP地址,这似乎是由于IP地址中的“.”。在测试了这两种情况下的随机数字集(12345)后,看到它确实加入了,这是我能得出的唯一结论

有没有人对此有经验,也许是一个解决办法?

建议的解决方案 只需遵循以下步骤:

  • 首先添加2个平面文件源(2个CSV)
  • 在每个连接器之后,使用以下表达式为
    ClientName
    添加派生列转换(以删除尾随空格并更新为大写)

  • 派生列之后,添加一个排序组件并选择列
    [ClientName]
    进行排序(在每个文件上)

  • 使用合并联接组件

  • 如果这不起作用,则问题可能是由编码差异引起的,或者是某些unicode字符对编辑器不可见导致了此问题

    更新1 根据OP评论:
    如果你在CSV文件中尝试这两个案例,我相信你会看到与我相同的结果,第一个有效,第二个无效。

    解决方案:

    获取此示例数据后,我将它们直接从您的注释复制到我的记事本++编辑器中,发现有些unicode字符显示为问号,这将导致值之间的差异

    一个建议是在每个源代码之后添加一个脚本组件,并使用脚本获得一个新的输出列(可以删除派生列)

    例如:

    注意:您必须导入
    System.Text.RegularExpressions
    才能使用
    RegEx

    建议的解决方案 只需遵循以下步骤:

  • 首先添加2个平面文件源(2个CSV)
  • 在每个连接器之后,使用以下表达式为
    ClientName
    添加派生列转换(以删除尾随空格并更新为大写)

  • 派生列之后,添加一个排序组件并选择列
    [ClientName]
    进行排序(在每个文件上)

  • 使用合并联接组件

  • 如果这不起作用,则问题可能是由编码差异引起的,或者是某些unicode字符对编辑器不可见导致了此问题

    更新1 根据OP评论:
    如果你在CSV文件中尝试这两个案例,我相信你会看到与我相同的结果,第一个有效,第二个无效。

    解决方案:

    获取此示例数据后,我将它们直接从您的注释复制到我的记事本++编辑器中,发现有些unicode字符显示为问号,这将导致值之间的差异

    一个建议是在每个源代码之后添加一个脚本组件,并使用脚本获得一个新的输出列(可以删除派生列)

    例如:


    注意:必须导入
    System.Text.RegularExpressions
    才能使用
    RegEx

    如果它们是字符串,它们的工作方式应该相同。你检查过尾随空格等了吗?@Matt OP发布了一些示例数据作为对我答案的评论。值中似乎有一些unicode字符,并且他正在使用的编辑器看不到这些字符。看看我的答案更新。如果它们是字符串,它们应该以相同的方式工作。你检查过尾随空格等了吗?@Matt OP发布了一些示例数据作为对我答案的评论。值中似乎有一些unicode字符,并且他正在使用的编辑器看不到这些字符。看一看我的答案更新。嗯,这样做很有效,它能够在135个IP地址的新案例中加入,但仍然遗漏了很多其他案例。@Wingman 1487最后一个尝试是将两列都改为大写。检查我的更新(派生列表达式)所做的更改,结果仍然相同。我觉得很奇怪,看看CSV文件,IP列没有区别,没有奇数字符,只有直接的IP和主机名。@Wingman 1487最后一次尝试时,将两个列转换为相同的unicode
    (DT_WSTR,50)UPPER(TRIM([ClientName])
    检查它是否为注释编码issue@Wingman1487根据你提供的信息,我认为你不会得到其他建议。如果你能附上示例文件,那会更好。很好,这样做很有效,它能够加入135个IP地址的新案例,但仍然错过了很多其他案例。@Wingman 1487最后一件事是尝试is将两个列都更改为大写。检查我的更新(派生列表达式)是否进行了更改,结果仍然相同。这对我来说很奇怪,在CSV文件中,IP列没有区别,没有奇数字符,只有直接的IP和主机名。@Wingman 1487上次尝试时,只将两个列转换为相同的unicode
    (DT_WSTR,50)UPPER(TRIM([ClientName])
    检查注释是否为编码issue@Wingman1487根据你提供的信息,我认为你不会得到其他建议。如果你能附上样本文件,那会更好
       Array    |   ClientName   |          Path
     ___________|________________|______________________
      myArray1  |     server1    |  /something/something
      myArray1  |     server2    |  /something/something
      myArray1  |  192.168.0.55  |  /something/something
      myArray2  |  192.172.6.10  |  /something/something
      myArray2  |     server5    |  /something/something
    
          ClientName  |   ResolvedClientName
       _______________|______________________
           server1    |        server1
           server2    |        server2
        192.168.0.55  |        server3
        192.172.6.10  |        server4
           server5    |        server5
    
    UPPER(TRIM([ClientName])
    
    ArrayName|ClientName|MountPath 
    array2.nam.nsroot.net|144.215.120.114|/mwdctov0285/ctoqt0285‌​
    array1-pr‌​.nam.nsroot.net|10.1‌​02.133.24|/mwdcerv06‌​18/cerqt0618
    
    ClientName|ResolvedClientName 
    144.215.120.114|client3.nam.nsroot.net
    10.102.133.‌​24|client1.nam.nsroo‌​t.net`
    
    If Not Row.ClientName_IsNull AndAlso _
       Not String.IsnullOrEmpty(Row.ClientName) Then
    
       Row.OutClientName = Regex.Replace(Row.ClientName, "[^0-9.]", "").ToUpper
    
       Else
    
       Row.OutClientName_IsNull = True
    End If