#sql #sql-server #sqlbulkcopy
#sql #sql-сервер #sqlbulkcopy
Вопрос:
Итак, у меня есть таблица со следующей структурой;
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. используйте
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
или их комбинация