2

固定幅のテキストファイルからビューにデータを読み込もうとしていますが、挿入は代わりのトリガーによってインターセプトされています。

トリガーの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だと思います。

前もって感謝します!

4

1 に答える 1

0

これはすべて無料で機能します。Unicodeを使用している場合でも、xsi:typeをNCharFixedではなくCharFixedに設定すると、この問題が解決しました。現在、データ内の奇妙な文字(入力ファイルに通常のテキストとして表示される)を処理しています。

于 2013-01-23T12:26:05.257 に答える