Загрузка многострочных записей в SQL Server - PullRequest
1 голос
/ 22 сентября 2011

Мы получаем наборы данных фиксированной длины от клиента, которые выглядят примерно так:

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 строки в одну запись (а затем снова выведены в виде текстового файла), например:

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 в том порядке, в котором данныепоявляется во входном файле штампа;Я не уверен, что это обязательно имело бы место.

Кто-нибудь знает?Или знаете лучший способ сделать это?

Спасибо
Карл

1 Ответ

1 голос
/ 22 сентября 2011

Редактировать: добавлено второе решение

Решение 1:

Вы не можете быть уверены в порядке вставки SQL Server. Вы должны выполнить некоторые обработки текстовых файлов перед импортом данных в SQL Server. Например, вы можете использовать PowerShell, чтобы добавить PK в файл следующим образом:

$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 content):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...