none
BULK INSERTと同時に固定値を登録する方法 RRS feed

  • 質問

  • BULK INSERTを用いて、ファイルからDBにデータを登録しようとしています。

    その際、特定のカラムには、ファイルからではなく、固定値を登録したいと考えています。

    方法をご存知でしたら、教えて頂きたいです。

    なお、上記の方法が不可能な場合、ファイルに合わせて登録したい固定値を書き込んだうえで、

    BULK INSERTするしかないかと考えています。

    ファイルからBULK INSERTした後に、対象のテーブルに固定値をUPDATEする方法も考えたのですが、

    BULK INSERTされた列の特定が困難では、という理由です。

    2016年10月4日 8:55

回答

  • BULK INSERTの構文を見る限り、不可能のようですね。

    ファイルからBULK INSERTした後に、対象のテーブルに固定値をUPDATEする方法も考えたのですが、

    BULK INSERTされた列の特定が困難では、という理由です。

    と、書かれていますが、今回BULK INSERTされた行のある列にだけ固定値を書き込みたいのだが、その行の特定が難しいということでしょうか? テーブルの構造によりますが、主キーを利用したり、トリガーを利用したりする方法も考えられます。また、一旦、一時テーブルにBULK INSERTし、その一時テーブルの列をupdateしてから、本当のテーブルにその一時テーブルからinsertする方法も考えられます。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク kosuke1012 2016年10月5日 4:18
    2016年10月5日 1:41

すべての返信

  • BULK INSERTの構文を見る限り、不可能のようですね。

    ファイルからBULK INSERTした後に、対象のテーブルに固定値をUPDATEする方法も考えたのですが、

    BULK INSERTされた列の特定が困難では、という理由です。

    と、書かれていますが、今回BULK INSERTされた行のある列にだけ固定値を書き込みたいのだが、その行の特定が難しいということでしょうか? テーブルの構造によりますが、主キーを利用したり、トリガーを利用したりする方法も考えられます。また、一旦、一時テーブルにBULK INSERTし、その一時テーブルの列をupdateしてから、本当のテーブルにその一時テーブルからinsertする方法も考えられます。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク kosuke1012 2016年10月5日 4:18
    2016年10月5日 1:41
  • BULK INSERTをする目的ってなんでしょうか?

    単純にファイルを元にしたいという意味だけ?

    ※目的によっては後でUPDATEはちょっとよろしくないかもしれません

    2016年10月5日 2:41
  • 不可能とのこと、承知しました。

    代替案として、ファイルに値を書き込んでからBULK INSERTという手は取りたくなかったのですが、

    トリガーを利用するという手を忘れておりました。また、一時テーブルを利用する方法も

    思いつきませんでした。

    上記2つの代替案のうち、いずれかで進めようと思います。

    大変助かりました。ありがとうございました。


    2016年10月5日 4:23
  • はい、ファイルを元にしたいというだけです。

    ただしその際、ファイルに書かれていない値も入力する必要があったため、困っていました。

    2016年10月5日 4:24
  • >トリガーを利用するという手を忘れておりました。B

    BULK INSERTでトリガーを使用するには、withオプションに、FIRE_TRIGGERSを指定する必要があると思いますのでご注意ください。

    また、ちょっと違うかな?と思って先の書き込みには書かなかったのですが、列の規定値を使う方法もあります。

    列の既定値の指定
    https://msdn.microsoft.com/ja-jp/library/ms187872.aspx


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2016年10月5日 4:32
  • FIRE_TRIGGERSオプションについて、ありがとうございます。行単位ではなくファイル単位にトリガーを起動させる方法と合わせて、ちょうど調べていました。

    列の規定値についても、ありがとうございます。ただしこちらは今回は利用出来なさそうです。

    なお、調べていたところ、

    INSERT...SELECT * FROM OPENROWSET(BULK...) 

    とすることで、ファイルと、ファイル以外の固定値を同時にDBに登録することが出来そうだと分かりました。

    今回は、結局この方法で進めようかと考えています。

    https://msdn.microsoft.com/ja-jp/library/ms175915.aspx


    2016年10月5日 10:09
  • とすることで、ファイルと、ファイル以外の固定値を同時にDBに登録することが出来そうだと分かりました。

    今回は、結局この方法で進めようかと考えています。

    https://msdn.microsoft.com/ja-jp/library/ms175915.aspx

    お~、素晴らしいです! 私の方でテストしてみましたが、完璧にうまく行きました。
    勉強になりました。情報、ありがとうございました。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2016年10月6日 0:51
  • 期せずしてお役にたつことが出来、良かったです!

    今後ともよろしくお願いします。

    2016年10月6日 5:24