none
IDENTITY列を持つテーブルに対してSSISでデータを移行したい。 RRS feed

  • 質問

  • お世話になっております。
    IDENTITY列を持つTESTテーブルに対して、同様のテーブルTEST2(10万件くらいデータが存在する)からSSISを使用してデータ移行を行おうとしています。


    CREATE TABLE [dbo].[TEST] (
        [ID] [int] IDENTITY (1, 1) NOT NULL ,
        [UserID] [nvarchar] (255) COLLATE Japanese_CI_AS NOT NULL
    )

    が、このまま実行すると、

    エラー 0xc0202049:
    DTS_E_ATTEMPTINGTOINSERTINTOAREADONLYCOLUMN
    読み取り専用の列 "__" に挿入できませんでした。

    と言われてエラーとなってしまいます。このような場合、どういった方法で回避すればよいのでしょうか?
    識者の方教えてください。

    よろしくお願いします。
    2009年12月17日 17:22

回答

  • OLE DB 変換先 にて「テーブルまたはビュー-高速読み込み」データアクセスモードで「ID を保持する」というオプションを指定すると
    ご期待の動作になるのではないかかと思います。(BULK INSERT の KEEPIDENTITY オプションに該当します。)

    ただ...Transact-SQLを書ける人にとって、一度の移動のためにSSISパッケージで実装することが効率的なのかどうかは分かりません。

    2009年12月22日 22:38

すべての返信

  • セルフレスです。上記のやり方、ご存知の方いませんか?SQLCMDを使用して行えばある程度簡単で、こんな形で可能であることは、わかりました。


    use TESTDB
    SET IDENTITY_INSERT dbo.TEST ON
    go

    IF NOT EXISTS(SELECT SEQ_NO FROM dbo.TEST)
                INSERT INTO dbo.TEST (OUTLINE, SEQ_NO)
                            SELECT OUTLINE, SEQ_NO FROM [192.168.0.10].[TESTDB].[dbo].[TEST]
    go
    SET IDENTITY_INSERT dbo.TEST OFF


    これと同等な処理をSSISで行いたいのです。IDENTITYを持つテーブルが、移行対象となるテーブルのうち、100テーブルくらいあるので、なるべくSSISで処理したいと考えています。

    少しでもご存知の方、情報をください。
    よろしくお願いします。

    2009年12月22日 10:14
  • OLE DB 変換先 にて「テーブルまたはビュー-高速読み込み」データアクセスモードで「ID を保持する」というオプションを指定すると
    ご期待の動作になるのではないかかと思います。(BULK INSERT の KEEPIDENTITY オプションに該当します。)

    ただ...Transact-SQLを書ける人にとって、一度の移動のためにSSISパッケージで実装することが効率的なのかどうかは分かりません。

    2009年12月22日 22:38
  • 情報、ありがとうございます。

    >ただ...Transact-SQLを書ける人にとって、一度の移動のためにSSISパッケージで実装することが効率的なのかどうかは分かりません。

    この一文が何よりのヒントになりました。顧客からDTSがあるから・・・という事を言われていたので鵜呑みにして調査していましたが、どうやってもこのツールが効率的にデータ移行を行えるとは思えなくて困っていました。(設定が一直線で、途中で変更できない、(チェック付けてるのに)エラーを無視したくても出来ない、移行が半端で、でエラーになると以後のテーブルが失敗する、その割には以前のテーブルにはデータが入ってしまうのでそこを消す事から再度やり直す羽目になる・・・など)

    自前でスクリプトを書くか、スクリプトを生成するexcelマクロを書いたほうが良さそうだと判断しました。

    2009年12月26日 4:32