Массовая загрузка / копирование SQL с ошибкой форматирования файла - PullRequest
0 голосов
/ 09 апреля 2019

Итак, у меня есть таблица со следующей структурой:

CREATE TABLE [dbo].[LoadAgencyInfo](
       [Agency] [varchar](4) NULL,
       [Fund] [varchar](1) NULL,
       [Account] [varchar](14) NULL,
       [LName] [varchar](20) NULL,
       [FName] [varchar](9) NULL,
       [SSN] [varchar](9) NULL,
       [Prior] [varchar](3) NULL,
       [BalDue] [varchar](8) NULL,
       [DRSBal] [varchar](8) NULL,
       [Fill1] [varchar](16) NULL,
       [FileDate] [varchar](6) NULL,
       [Fill2] [varchar](3) NULL,
       [P1] [varchar](2) NULL,
       [P2] [varchar](2) NULL
) ON [PRIMARY]
GO

У меня есть плоский файл, который я собираюсь массово загрузить в базу данных.Формат файла следующий и представляет собой обычный текстовый файл, см. Ниже;Есть несколько разных файлов, но все они следуют этому формату.

Образцы данных

2000S10000252      VYUSBN              RUDXOD   0099882260000006824100000000                181802      
2300S20000350      TEVXXXX             TGXC     0025045640000000652800000000                052153      

Предполагается, что файл будет иметь следующий формат в зависимости от длины символа.Каждая ячейка должна заполняться правильной информацией в зависимости от того, где находятся символы в файле / записи.Записи с шириной нулевой заливки должны заполняться нулями.Записи с пропуском этого поля должны пропускать определенное поле и не помещать никаких данных в ячейку.

Разбиение файла

Field Name
Character Start
Character End
Width
Agency
1
4
4
Fund
5
5
1
Account
6
19
14
LName
20
39
20
FName
40
48
9
SSN
49
57
9
Prior
58
60
3 (Zero fill, doesn’t come from text file default to 000)
BalDue
61
68
8
DrsBal
69
76
8 (Zero fill, doesn’t come from text file default to 00000000)
Fill1
77
92
16 (Skip this field)
FileDate
93
98
6
Fill2
99
105
7 (skip this field)

Плоский файл должен следовать строгим правилам вдлина символа, например, первые четыре символа принадлежат ячейке агентства, а следующий символ принадлежит ячейке фонда и т. д. Обратите внимание, что нет разделенных символов, поэтому для обработки записей я использую файл формата SQLи введите их в базу данных.Однако независимо от того, что я делаю, соответствующие ячейки либо не заполнены, либо частично заполнены, и когда я пытаюсь пропустить поля, поля, которые я пропускаю, заполняются.Я попытался изменить тип данных на nvarchar, но все еще не работает.Иногда данные искажаются и не переводятся должным образом.

См. Файл формата ниже;

<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
       <FIELD ID="1" xsi:type="CharFixed" MAX_LENGTH="4" />
       <FIELD ID="2" xsi:type="CharFixed" MAX_LENGTH="1"/>
       <FIELD ID="3" xsi:type="CharFixed" MAX_LENGTH="14"/>
       <FIELD ID="4" xsi:type="CharFixed" MAX_LENGTH="20"/>
       <FIELD ID="5" xsi:type="CharFixed" MAX_LENGTH="9"/>
       <FIELD ID="6" xsi:type="CharFixed" MAX_LENGTH="9"/>
       <FIELD ID="7" xsi:type="CharFixed" MAX_LENGTH="3"/>
       <FIELD ID="8" xsi:type="CharFixed" MAX_LENGTH="8"/>
       <FIELD ID="9" xsi:type="CharFixed" MAX_LENGTH="8"/>
</RECORD>
<ROW>
       <COLUMN SOURCE="1" NAME="Agency" xsi:type="SQLINT" LENGTH="4"/>
       <COLUMN SOURCE="2" NAME="Fund" xsi:type="SQLNVARCHAR" LENGTH="1"/>
       <COLUMN SOURCE="3" NAME="Account" xsi:type="SQLNVARCHAR" LENGTH="14"/>
       <COLUMN SOURCE="4" NAME="LName" xsi:type="SQLNVARCHAR" LENGTH="20"/>
       <COLUMN SOURCE="5" NAME="FName" xsi:type="SQLNVARCHAR" LENGTH="9"/>
       <COLUMN SOURCE="6" NAME="SSN" xsi:type="SQLINT" LENGTH="9"/>
       <COLUMN SOURCE="7" NAME="Prior" xsi:type="SQLINT" LENGTH="3"/>
       <COLUMN SOURCE="8" NAME="BalDue" xsi:type="SQLINT" LENGTH="8"/>
       <COLUMN SOURCE="9" NAME="DRSBal" xsi:type="SQLINT" LENGTH="8"/>
</ROW>
</BCPFORMAT>

Любая помощь относительно того, почему это не работает, будет очень полезной

1 Ответ

0 голосов
/ 12 апреля 2019

Итак, я внес некоторые изменения в XML-файл формата SQL и в саму команду SQL, как вы можете видеть ниже.Теперь проблема в том, что все соответствующие поля заполняются, когда я запускаю команду, но последняя ячейка в первой строке получает все данные следующей строки, так как имеется более 2000 строк.Что должно произойти, это после того, как после шестого символа в поле FileDate данные должны переместиться в следующую строку, а не помещать все последующие строки в поле FileDate.Я попытался обновить поле ROWTERMINATOR с 0x0a, 'n,' r, 'r'n,' n'r, но, похоже, ничего не работает.Я также озадачен тем, почему команда не соответствует атрибуту MAX_LENGTH, так как он имеет значение 6, и почему ни один из разделителей строк не работает?Я занимаюсь этим уже несколько дней, и это сводит меня с ума.

Исходный файл представляет собой текст плана с компьютера с Unix, и в качестве ограничителя строки используется только lf.Я не могу опубликовать изображение данных, потому что у меня нет 10 точек повторения.

XML File
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharFixed" LENGTH="4" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="2" xsi:type="CharFixed" LENGTH="1" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="CharFixed" LENGTH="14" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="CharFixed" LENGTH="20" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="5" xsi:type="CharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="6" xsi:type="CharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="7" xsi:type="CharFixed" LENGTH="3" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="8" xsi:type="CharFixed" LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="9" xsi:type="CharFixed" LENGTH="8" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="10" xsi:type="CharFixed" LENGTH="16" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="11" xsi:type="CharTerm" MAX_LENGTH='6' TERMINATOR="0x0a" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Agency" xsi:type="SQLCHAR" />
<COLUMN SOURCE="2" NAME="Fund" xsi:type="SQLCHAR" />
<COLUMN SOURCE="3" NAME="Account" xsi:type="SQLCHAR" />
<COLUMN SOURCE="4" NAME="LName" xsi:type="SQLCHAR" />
<COLUMN SOURCE="5" NAME="FName" xsi:type="SQLCHAR" />
<COLUMN SOURCE="6" NAME="SSN" xsi:type="SQLCHAR" />
<COLUMN SOURCE="7" NAME="Prior" xsi:type="SQLCHAR" />
<COLUMN SOURCE="8" NAME="BalDue" xsi:type="SQLCHAR" />
<COLUMN SOURCE="9" NAME="DRSBal" xsi:type="SQLCHAR" />
<COLUMN SOURCE="10" NAME="Fill1" xsi:type="SQLCHAR" />
<COLUMN SOURCE="11" NAME="FileDate" xsi:type="SQLNCHAR" />
</ROW>
</BCPFORMAT>
...