固定幅のテキストファイルからビューにデータを読み込もうとしていますが、挿入は代わりのトリガーによってインターセプトされています。
トリガーのINSERTEDから値を出力することになっているデバッグ選択はトリガーされないので、失敗のポイントは一括挿入自体であると思われます。
詳細は次のとおりです。使用しているものは次のとおりです。
一括挿入コマンドの開始は次のようになります。
BULK INSERT Staging.vViewSolelyForInsertion
FROM 'X:\path\to\datafile.txt'
WITH
(
FORMATFILE='X:\path\to\formatfile.xml',
FIRE_TRIGGERS,
ERRORFILE='X:\path\to\Error.log'
)
Staging.vViewSolelyForInsertionに使用されるCREATEコマンド:
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="\r\n" 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で終了する行で構成され、データフィールド間に区切り文字はなく、Unicodeで保存されます。各行の長さは138文字で、行末に\ r\nがあります。
私が得るエラーは次のとおりです。
行1、列2(議長)のバルクロードデータ変換エラー(切り捨て)。
ImportFile.xmlのフィールドの長さは、ImportFile.xmlの列の長さと同じであり、Staging.vViewSolelyForInsertionのnvarcharの長さと同じです。上で述べたように(私はそれがずっと前であることを知っています)、トリガーの最初のデバッグステートメントは実行されないので、失敗するのはBULKINSERTだと思います。
前もって感謝します!