none
データチェック用SQLについて RRS feed

  • 質問

  • いつもお世話になっております。

    一時テーブルに登録したテキストファイルのデータとマスタのデータを比較し、
    不一致のデータが存在すればSQLにて抽出したいのですがアイデアが思いつきません。
    もし、可能であればご教示頂き度。

    無理な場合は、マスタからデータを取得してカーソルで回し、
    一致するかどうかを1件毎チェックしようと考えています。

    チェック内容として、①と②の両方が満たされているかを確認します
    ①一時テーブルに登録されているフィールドの順番とマスタの列№が一致する事
    ②一時テーブルのデータと列名のデータが一致する事

    下記の場合、Field2に本来は【チェック2】が格納されているはずが【チェック3】が入っているので
    以降のField2、Filed3のデータを抽出したいです

    〇一時テーブル
    列名 ⇒Field1   Field2 Field3
    データ⇒チェック1 チェック3  チェック4

    〇マスタテーブル
    列名⇒ シート名 列№ 列名
    データ⇒AAAAA  1  チェック1
    データ⇒AAAAA  2  チェック2
    データ⇒AAAAA  3  チェック3
    データ⇒AAAAA  4  チェック4

    以上、何卒宜しくお願い申し上げます。


    • 編集済み kong0214 2016年2月23日 7:43
    2016年2月23日 6:17

回答

  • 一時テーブルの列数はさほど多くなさそうですね。
    SQL Server 2008から使えるテーブル値パラメーターでストアドプロシージャに渡してしまえば良いように思えます。そうすればストアドプロシージャ内でテーブルとして扱えます。

    >一時テーブルに登録した値の入力チェックを完了後、正規用テーブルにInsert Selectする予定ですので
    データを横⇒縦に変更する事は考えていません。

    とのことですので、これとは別に先に述べたストアドプロシージャに渡すテーブル値パラメータ用として横⇒縦に変更したDataTableを渡してはいかがでしょうか?
    いずれにしても列方向にしたがってチェックをするのは基本的に難しくなります。行方向に持っていれば、SQLで何とかなるように思います。
    #すみません。時間が取れないので検証せず、感覚で物を言っています。

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

    • 回答としてマーク kong0214 2016年2月23日 9:28
    2016年2月23日 9:07

すべての返信

  • いくつか質問があります。
    1.一時テーブルの列数は固定なのでしょうか?
    2.一時テーブルの列に値を持つのではなく、行方向に持つことは可能なのでしょうか?
    3.一時テーブルの列名に規則性はありますか? 例えば、「同じ単語 + 連番」になっている等。
    4.一時テーブルの列名に規則性がない場合、規則性を持たすことは可能でしょうか?例えば列名を単純に連番にすることは可能でしょうか?

    さて、ご質問から、マスターテーブルに登録されている列Noに対する列名が間違っていないかをチェックされたいように思われます。
    であれば、まずチェックしやすいように一時テーブルを作成するトライをされてみてはいかがでしょうか?
    例えば一時テーブルを以下のように作成できないでしょうか?

    〇一時テーブル

    AAAAA Field1 1 チェック1
    AAAAA Field2 2 チェック3
    AAAAA Field3 3 チェック4

    また、SQL Serverの場合、そのバージョンによって使えるSQLが変ってきますので、バージョンを教えて下さい。


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

    2016年2月23日 7:09
  • いつもお世話になっております。

    DBのバージョン = SQL Server 2008R2

    >1.一時テーブルの列数は固定なのでしょうか?
    一時テーブルはExcelシートをテキスト変換して登録します。
    シート毎によって作成するテーブルの列名はバラバラですが、再実行する際の同名のテーブルの列数は固定です。

    >2.一時テーブルの列に値を持つのではなく、行方向に持つことは可能なのでしょうか?
    一時テーブルに登録した値の入力チェックを完了後、正規用テーブルにInsert Selectする予定ですので
    データを横⇒縦に変更する事は考えていません。

    >3.一時テーブルの列名に規則性はありますか? 例えば、「同じ単語 + 連番」になっている等。
    一時テーブルの列名も決めておりませんので、一時テーブルに規則性を持たせることは可能です。

    最終的には一時テーブルのデータを多少編集して正規用テーブルに登録したい為、
    一時テーブルをご提案頂いた構成にする事は避けたいです。


    標題と違った内容になってしまうのですが、一時テーブルをBulk Insertで登録する際に作成する予定ですが
    下記だと『オブジェクト名 '#TEST1' が無効です』と表示されてしまいます。
    GOの後にテーブルをCreateすればエラーがなくなるのですが、参考サイトのように
    Createせずとも作成出来ないものでしょうか?
    参考サイト = https://technet.microsoft.com/ja-jp/library/ms191503(v=sql.105).aspx

    USE TEST_DB;
    GO
    --CREATE TABLE #TEST1(aaa varchar(50),bbb varchar(50),ccc varchar(50),ddd varchar(50),eee varchar(50),fff varchar(50))
    BULK INSERT #TEST1
       FROM 'D:\TEST\TEST.txt'
       WITH (
          DATAFILETYPE = 'char',
          FIELDTERMINATOR = ',',
          KEEPNULLS
       );
    GO


    以上、何卒宜しくお願い申し上げます。

    2016年2月23日 8:02
  • 一時テーブルの列数はさほど多くなさそうですね。
    SQL Server 2008から使えるテーブル値パラメーターでストアドプロシージャに渡してしまえば良いように思えます。そうすればストアドプロシージャ内でテーブルとして扱えます。

    >一時テーブルに登録した値の入力チェックを完了後、正規用テーブルにInsert Selectする予定ですので
    データを横⇒縦に変更する事は考えていません。

    とのことですので、これとは別に先に述べたストアドプロシージャに渡すテーブル値パラメータ用として横⇒縦に変更したDataTableを渡してはいかがでしょうか?
    いずれにしても列方向にしたがってチェックをするのは基本的に難しくなります。行方向に持っていれば、SQLで何とかなるように思います。
    #すみません。時間が取れないので検証せず、感覚で物を言っています。

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

    • 回答としてマーク kong0214 2016年2月23日 9:28
    2016年2月23日 9:07
  • いつもお世話になっております。

    縦方向と横方向のデータをSQLで一発でチェックするのは難しいですよね・・・

    テーブル値パラメータは使用した事がありませんが、参考サイトを見つけましたので

    今回の仕様に向いているようでしたら使ってみようと思います。

    有難うございました。

    2016年2月23日 9:28