2011-09-22 55 views
1

我们从客户端接收固定长度的数据集,看起来是这样的:上传多行记录到SQL Server

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的哪些组合彼此相关,但是在所有情况下,它们已经在原始数据中被排序为直接出现在彼此之下。

我需要的是一个预处理步骤,将采取原始数据,然后(作为一个txt文件再次,然后输出)正确的2,3和4线组合成一个记录,像这样:

20110101ABC999JOHN   SMITH  198002015000000  1000 
20060101DEF999JANE   KOTZE  19811001200000  800 

我曾想过将bcp转换为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上的数据出现在模输入文件;我不确定这是否会如此。

有谁知道吗?或者知道一个更好的方法来做到这一点?

感谢
卡尔

+0

我从一个角度接入点讲话。数据是否已存在于Access或文本文件中?如果它在没有主键的Access中,则已经有重大问题。如果它是一些描述的文本文件,则可以使用导入向导导入到Access中,以便分配ID。这将保持顺序。然后,我会倾向于运行一点VBA来整理。 – Fionnuala

+0

将数据提交给我们的文本文件 – Karl

+0

我是一个Access人员,因此对于我来说,导入Access最容易,允许它添加自动编号ID以保留行顺序,然后在整个记录集中运行一些VBA。 – Fionnuala

回答

1

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

解决方案1:

关于SQL服务器的插入顺序您不能肯定。 在导入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 
+0

因此,当您导入此文件的处理版本时,记录失灵? – JeffO

+0

我不是那么说。我说这是安全的,不要假设某种插入顺序。 –

+0

使用Access时,假设记录按正确的顺序导入并且分配的ID反映了这一点是安全的。 – Fionnuala