Ошибка массовой загрузки / копирования SQL с файлом формата

#sql #sql-server #sqlbulkcopy

#sql #sql-сервер #sqlbulkcopy

Вопрос:

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

 CREATE TABLE [dbo].[LoadAgencyInfo](
       [Agency] [varchar](4NULL,
       [Fund] [varchar](1NULL,
       [Account] [varchar](14NULL,
       [LName] [varchar](20NULL,
       [FName] [varchar](9NULL,
       [SSN] [varchar](9NULL,
       [Prior] [varchar](3NULL,
       [BalDue] [varchar](8NULL,
       [DRSBal] [varchar](8NULL,
       [Fill1] [varchar](16NULL,
       [FileDate] [varchar](6NULL,
       [Fill2] [varchar](3NULL,
       [P1] [varchar](2NULL,
       [P2] [varchar](2NULLON [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. используйте LENGTH атрибут в FIELD элементах для данных фиксированной длины и удалите LENGTH из COLUMN .

2. @AlexKudryashev Я обновил свой вопрос, смотрите ниже.

Ответ №1:

Итак, я внес некоторые коррективы в 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>
  

Комментарии:

1. terminator должно быть n , r или их комбинация