🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

3回答

2485閲覧

【SQL】前回の出力から差分のみCSV出力したい

JipvOvxMCyFrRX2

総合スコア18

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2019/12/12 07:59

編集2019/12/12 08:01

SQLのデータをSQLファイルとバッチファイルでCSV出力しています。
セレクトしたフラグの全データを出力することはできたのですが
前回の出力から差分のみを出力したいです。

ご教示のほど宜しくお願い致します。

【SQLファイル】
set nocount on

select
担当者コード,担当者名,役職コード,基本給1,交通費,交通費定期
from
社員_MT
order by
担当者コード

set nocount off

【バッチファイル】
@ECHO OFF
CD %~dp0
SQLCMD -S DESKTOP-NOMM63I\SQL2014EXPRESS -E -d MSDE -i syain.sql -s, -W -h -1 -o syain.csv

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2019/12/12 08:10

> 前回の出力から差分 前回の出力はどのように保存してますか? それが解らないことには差分の取りようがないです。
JipvOvxMCyFrRX2

2019/12/12 08:48

ご返信ありがとうございます。 前回の出力もCSVです。 回答がずれていたら申し訳ございません。
guest

回答3

0

自己解決

今回、この質問をさせていただいたのが、
データを最終的にグーグルスプレッドシートにあげたい為でした。

SQLからグーグルスプレッドシートまでのデータ移行のどこかで
差分移行をしなければ、データ量が多い場合に重くなってしまうので
SQLからデータを出力する際に差分で取り出せないかなと考えました。

ですが、CSVからグーグルスプレッドシートにデータをあげる際に
差分で取り込む方法を先に発見したので、今回はこちらの方法で差分と取り込みをいたしました。

ご回答してくださった方には大変申し訳なく存じます。。

グーグルスプレッドシートでCSVデータの前回の取り込み分からの差分データを取り込むスクリプトを記載させていただきます。

var ss = SpreadsheetApp.getActiveSpreadsheet(); var ssName = ss.getName(); var ssId = DriveApp.getFilesByName(ssName).next().getId(); var ssOpen = SpreadsheetApp.openById(ssId); //データ取得///////////////////////////////////////////////////////// function data_import() { var data_sh = ssOpen.getSheetByName('data'); // 対象のCSVファイルが置かれているフォルダ名、ファイル名 var folderName = "グーグル同期"; var fileName = "data.csv"; var folders = DriveApp.getFoldersByName(folderName); //フォルダとファイルの検索 while (folders.hasNext()) { var folder = folders.next(); if (folder.getName() == folderName) { var files = DriveApp.getFilesByName(fileName); while (files.hasNext()) { var file = files.next(); if (file.getName() == fileName) { //設定しないでShift_JISのままだと文字化けする var data = file.getBlob().getDataAsString("Shift_JIS"); var csv = Utilities.parseCsv(data); } //もしデータが空だったら if (!data_sh.getRange(2,1).getValue()){ //セルA1からCSVの内容を書き込んでいく data_sh.getRange(2,1,csv.length,csv[0].length).setValues(csv); return; } //もしデータがあったら else{ //新データがない場合エラーになるので回避 try{ //差分書き込み const r = data_sh.getLastRow(); const tail = csv.slice(r-1); data_sh.getRange(r+1,1,tail.length,6).setValues(tail); return; } catch(e){ } } } } } }

投稿2020/02/14 05:55

JipvOvxMCyFrRX2

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

もともとAというデータがあったとき
Bというデータを追加して前回からの差分Bを抜き出すとします
次にCを追加して前回からの差分をとるとき前回はA+BからBを取り出しているので
今回はA+B+CからBをのぞいたA+Cが差分になります。
同様にDを追加すると、A+B+C+DからA+Cを覗いたB+Dが次の差分
つまり「前回の差分」を基準にするとむちゃくちゃです

投稿2019/12/16 04:03

yambejp

総合スコア116661

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず、前回の出力から差分が欲しいなら前回出力した事実を何らかの形で保存しておく必要があります。
出力したファイル自体を保存しておく方法もありますが、手間がかかるのでDBに保存することをお勧めします。

どのようにするかですが、幾通りもやり方がありますから私のお勧めだけを述べます。
1.社員_MTがマスタデータの場合
社員_MTの出力履歴のテーブルを新たに作成します。
カラムはサロゲートキーと社員_MTのプライマリキーと出力時刻の3つで良いでしょう。

2.社員_MTがトランザクションデータの場合
社員_MTに最終出力時刻のカラムを追加します。

いずれにしてもファイル出力とデータ追加または更新のトランザクション処理が必要ですので、
ストアドプロシージャを書くか、フロントエンドアプリケーションで実行することをお勧めします。

投稿2019/12/13 09:13

hihijiji

総合スコア4152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問