2011-09-22 28 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