SQL Server: ошибка преобразования данных массовой загрузки
Я пытаюсь загрузить некоторые данные из текстового файла фиксированной ширины в представление, при этом вставка перехватывается триггером вместо.
Debug select, который должен выводить значения из INSERTED в триггере, не срабатывает, поэтому я подозреваю, что точка отказа - это сама массовая вставка.
Вот подробности: Вот что я использую:
Инициирующая команда bulk insert выглядит следующим образом:
BULK INSERT Staging.vViewSolelyForInsertion
FROM 'X:pathtodatafile.txt'
WITH
(
FORMATFILE='X:pathtoformatfile.xml',
FIRE_TRIGGERS,
ERRORFILE='X:pathtoError.log'
)
Создать команду, используемую для Постановка.vViewSolelyForInsertion:
CREATE VIEW Staging.vViewSolelyForInsertion
AS
SELECT
CONVERT(NVARCHAR(4), NULL, 0) AS Door,
CONVERT(NVARCHAR(9), NULL, 0) AS Chair,
CONVERT(NVARCHAR(24), NULL, 0) AS Office,
CONVERT(NVARCHAR(10), NULL, 0) AS Telephone,
CONVERT(NVARCHAR(4), NULL, 0) AS Cup,
CONVERT(NVARCHAR(1), NULL, 0) AS Headphones,
CONVERT(NVARCHAR(20), NULL, 0) AS Mouse,
CONVERT(NVARCHAR(12), NULL, 0) AS Keyboard
Команда CREATE используется для создания триггера
CREATE TRIGGER Staging.ON_INSERT_Staging_vViewSolelyForInsertion
ON Staging.vRefViewSolelyForInsertion
BEGIN
SELECT * FROM INSERTED -- debug, the error message appears before this point.
/*
This table exists to generate the InternalId.
*/
DECLARE @tbl TABLE
(
InternalId UNIQUEIDENTFIER NOT NULL DEFAULT NEWID(),
Door,
Chair,
Office,
Telephone,
Cup,
Headphones,
Mouse,
Keyboard
)
INSERT INTO @tbl
(
Door,
Chair,
Office,
Telephone,
Cup,
Headphones,
Mouse,
Keyboard
)
SELECT
i.Door,
i.Chair,
i.Office,
i.Telephone,
i.Cup,
i.Headphones,
i.Mouse,
i.Keyboard
FROM INSERTED i
SELECT * FROM @tbl -- 2nd debug
INSERT INTO Staging.ActualTable
(
InternalId,
Door,
Chair,
Office,
Telephone,
Cup,
Headphones,
Mouse,
Keyboard
)
SELECT
-- Lots of processing goes on here.
t.InternalId,
ProcessDoor(t.Door, t.InternalId),
ProcessChair(t.Chair, t.InternalId),
ProcessOffice(t.Office, t.InternalId),
ProcessTelephone(t.Telephone, t.InternalId),
ProcessCup(t.Cup, t.InternalId),
ProcessHeadphones(t.Headphones, t.InternalId),
ProcessMouse(t.Mouse, t.InternalId),
ProcessKeyboard(t.Keyboard, t.InternalID)
FROM @tbl t
DELETE FROM @tbl
END
Это формат файла, который я использую
<?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="NCharFixed" LENGTH="4" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="2" xsi:type="NCharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="3" xsi:type="NCharFixed" LENGTH="24" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="4" xsi:type="NCharFixed" LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="5" xsi:type="NCharFixed" LENGTH="4" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="6" xsi:type="NCharFixed" LENGTH="4" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="7" xsi:type="NCharFixed" LENGTH="1" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="8" xsi:type="NCharFixed" LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="9" xsi:type="NCharFixed" LENGTH="10" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="10" xsi:type="NCharFixed" LENGTH="4" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="11" xsi:type="NCharFixed" LENGTH="9" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="12" xsi:type="NCharFixed" LENGTH="20" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="13" xsi:type="NCharFixed" LENGTH="12" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
<FIELD ID="14" xsi:type="CharTerm" TERMINATOR="rn" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="Door" LENGTH="4" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="2" NAME="Chair" LENGTH="9" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="3" NAME="Office" LENGTH="24" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="4" NAME="Telephone" LENGTH="10" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="5" NAME="Cup" LENGTH="4" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="7" NAME="Headphones" LENGTH="1" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="12" NAME="Mouse" LENGTH="20" xsi:type="SQLNVARCHAR"/>
<COLUMN SOURCE="13" NAME="Keyboard" LENGTH="12" xsi:type="SQLNVARCHAR"/>
</ROW>
</BCPFORMAT>
Файл данных состоит изr n завершенных строк, без разделителей между полями данных и сохраняется в юникоде. Каждая строка имеет длину 138 символов, плюс rn в конце строки.
Ошибка, которую я получаю, следующая:
Ошибка преобразования данных массовой загрузки (усечение) для строки 1, столбца 2 (стул).
Поле длины из файла импорта.xml-данные совпадают с длинами столбцов в файле импорта.XML-это же как аргумент длин в постановке.vViewSolelyForInsertion. Как упоминалось выше (я знаю, что это было давно), первый оператор отладки в триггере не выполняется, что заставляет меня думать, что это массовая вставка, которая терпит неудачу.
Заранее спасибо!