将多行记录上载到SQL Server

时间:2011-09-22 07:49:45

标签: sql-server-2008 ms-access import multiline bcp

我们从客户端收到固定长度的数据集,如下所示:

1 SOMEFILE   20110922
2 20110101ABC999  
3 JOHN         SMITH     19800201
4 5000000       1000
2 20060101DEF999  
3 JANE         KOTZE     19811001
4 200000        800
5 5200000       1800

其中每行第一个位置的数字表示该行中的信息类型。类型是:

1  Header record (only appears once, in the first line)  
2  Contract record  
3  Person record  
4  Amounts record  
5  Trailer record (only appears once, in the last line)

2,3和4中的信息实际上都与一条记录有关,我需要在上传阶段找到一种方法将它们组合成一条记录。没有标识符明确指定2,3和4的哪些组合彼此属于,但在所有情况下,它们都已在原始数据中排序,直接显示在彼此之下。

我需要的是一个预处理步骤,它将获取原始数据,然后将正确的2,3和4行合并为一个记录(然后再输出为txt文件),如下所示:

20110101ABC999JOHN         SMITH     198002015000000       1000
20060101DEF999JANE         KOTZE     19811001200000        800

我想过将bcp'ing转换为SQL(甚至只是使用Access)并将自动递增的整数指定为PK。即:

  PK Type  Record 
  1  1     SOMEFILE   20110922
  2  2     20110101ABC999  
  3  3     JOHN         SMITH     19800201
  4  4     5000000       1000
  5  2     20060101DEF999  
  6  3     JANE         KOTZE     19811001
  7  4     200000        800
  8  5     5200000       1800

然后做类似的事情:

select 
type2.[record]+type3.[record]+type4.[record]
from

(select [record] from uploaded where [type]=2) as type2

join
(select [record] from uploaded where [type]=3) as type3
on type2.PK + 1 = type3.PK

join
(select [record] from uploaded where [type]=4) as type4
on type2.PK + 2 = type4.PK

但我担心的是,这完全取决于SQL Server按照数据输入文件中出现的顺序分配PK;我不确定是否会出现这种情况。

有谁知道吗?或者知道更好的方法吗?

感谢
卡尔

1 个答案:

答案 0 :(得分:1)

编辑:添加了第二个解决方案

解决方案1:

您无法确定有关SQL Server插入顺序的信息。 在SQL Server中导入数据之前,必须执行一些文本文件处理。例如,您可以使用PowerShellPK添加到文件中:

$rows = GET-CONTENT -PATH D:\BD\Samples\MyData.txt

for($i=0; $i -lt $rows.length; $i++)
{
    $row = $rows[$i]
    $temp=("00000"+[string]($i+1))
    $rows[$i]=$temp.substring($temp.length-5)+" "+$row

}

SET-CONTENT -PATH D:\BD\Samples\MyDataResults.txt $rows

之前(MyData.txt内容):

1 SOMEFILE   20110922
2 20110101ABC999
3 JOHN         SMITH     19800201
4 5000000       1000
2 20060101DEF999
3 JANE         KOTZE     19811001
4 200000        800
5 5200000       1800

PowerShell处理后MyDataResults.txt内容:

00001 1 SOMEFILE   20110922
00002 2 20110101ABC999
00003 3 JOHN         SMITH     19800201
00004 4 5000000       1000
00005 2 20060101DEF999
00006 3 JANE         KOTZE     19811001
00007 4 200000        800
00008 5 5200000       1800

在两个PS脚本中,我假设您可以插入最大值。 99999行。

解决方案2:

$rows = GET-CONTENT -PATH D:\BD\Samples\MyData.txt

$rows[0]="00000 "+$row
$rows[$rows.length-1]="99999 "+$row

$groupid=0

for($i=1; $i -lt $rows.length-1; $i=$i+3)
{
    $groupid++

    $row = $rows[$i]
    $temp=("00000"+[string]$groupid)
    $rows[$i]=$temp.substring($temp.length-5)+" "+$row

    $row = $rows[$i+1]
    $temp=("00000"+[string]$groupid)
    $rows[$i+1]=$temp.substring($temp.length-5)+" "+$row

    $row = $rows[$i+2]
    $temp=("00000"+[string]$groupid)
    $rows[$i+2]=$temp.substring($temp.length-5)+" "+$row        

}

SET-CONTENT -PATH D:\BD\Samples\MyDataResults2.txt $rows

结果:

00000 4 200000        800
00001 2 20110101ABC999
00001 3 JOHN         SMITH     19800201
00001 4 5000000       1000
00002 2 20060101DEF999
00002 3 JANE         KOTZE     19811001
00002 4 200000        800
99999 4 200000        800