質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

3回答

5339閲覧

バッチファイルからマスタデータを取得する方法

maam

総合スコア55

SQL

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2019/02/13 06:10

バッチファイルからSQLServerにあるDBの指定したテーブルのデータを取得し
取得したデータを違うサーバへインサートする処理を作成しています。
SQL文を別ファイルで作成し、SQLコマンドで呼び出すように進めています。

以下がコードです。

bat

1 2rem ## フォルダ設定 3rem ルートDIR 4set root_dir=’ルートDIR’ 5rem ログファイルフルパス 6set log_name=%root_dir%フルパス.log 7rem データ保管先 8set get_dir=D:'保管先' 9 10rem データ取得フォルダ作成 11if not exist %get_dir% mkdir %get_dir% 12if not exist %get_dir%\%year% mkdir %get_dir%\%year% 13if not exist %get_dir%\%year%\%month% mkdir %get_dir%\%year%\%month% 14 15rem データ取得 16SQLCMD -S サーバ名 -U ユーザ名 -P パスワード -i %root_dir%DATA.SQL -s, -W -h -1 -o Qutput.csv >> %log_name% 17SQLCMD -S サーバ名 -U ユーザ名 -P パスワード -i %root_dir%INSERT.SQL >> %log_name% 18

SQL

1DATA.SQL2 3DECLARE @d datetime = GETDATE() 4DECLARE @d1 char(8) = CONVERT(char(8), @d, 112) 5DECLARE @d2 char(6) = REPLACE( CONVERT(char(8), @d, 108), ':', '' ) 6DECLARE @d3 char(4) = CONVERT(char(4), @d, 111) 7DECLARE @d4 char(2) = CONVERT(char(2), @d, 1) 8 9DECLARE @eName varchar(70) = 'D:\Dataget\SQLServer\data\' + @d3 + '\' + @d4 + '\' + @d1 + @d2 + _dbMst' +'.csv' 10 11SELECT * FROM sys.objects where type ='U' AND name NOT IN('CUSTOM','PRO')= @eName 12

SQL

1INSERT.SQL2 3DECLARE @d datetime = GETDATE() 4DECLARE @d1 char(8) = CONVERT(char(8), @d, 112) 5DECLARE @d2 char(6) = REPLACE( CONVERT(char(8), @d, 108), ':', '' ) 6DECLARE @d3 char(4) = CONVERT(char(4), @d, 111) 7DECLARE @d4 char(2) = CONVERT(char(2), @d, 1) 8 9DECLARE @eName varchar(70) = ¥’保存先’¥ + @d3 + '\' + @d4 + '\' + @d1 + @d2 + '_dbMst_INSERT' + '.csv' 10 11BULK INSERT 'テーブル名' FROM DISK =@eName 12WITH 13( 14 FIELDTERMINATOR = ',', 15 ROWTERMINATOR = '\n' 16) 17

実行してみるても、ファイルは作成されるのですがlog内が空白なのと、
データの保管先であるget_dirにcsvファイルが作成されません。
なにかアドバイスをいただけないでしょうか。

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

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

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

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

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

sazi

2019/02/13 08:02

単なる環境構築とか、連携処理の類とかの背景を追記された方が良いかと思います。
guest

回答3

0

ベストアンサー

bcpコマンドですが、簡単に書くと下記のようになります。

エクスポート

bcp テーブル名 out "出力ファイル名" -S サーバー名 -U ユーザー名 -P パスワード

インポート

bcp テーブル名 in "入力ファイル名" -S サーバー名 -U ユーザー名 -P パスワード

詳しい使い方に関しては検索してみてください。

投稿2019/02/13 07:37

YAmaGNZ

総合スコア10242

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

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

maam

2019/02/13 08:49

ご回答ありがとうございます。調べてやってみます!
guest

0

SQLServerにあるDBの指定したテーブルのデータを取得し、取得したデータを違うサーバへインサートする処理を作成しています。

突っ込み処が満載ですね。

sys.objectsから取得できるのはテーブル名であってテーブルの内容ではない。
・テーブルが違えば、レイアウトが異なるので同じCSVで処理はできない。

取り敢えずはこれ位。

データの移植なら、バックアップ/リストアで良さそうですが?

投稿2019/02/13 06:22

編集2019/02/13 06:34
sazi

総合スコア25173

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

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

maam

2019/02/13 06:31

ご回答ありがとうございます。 >・sys.objectsから取得できるのはテーブル名であってテーブルの内容ではない。 SQLServerでこのSQL文を実行するとデータが表示されたのですが、これでは内容が取得できてないのですか? >・テーブルが違えば、レイアウトが異なるので同じCSVで処理はできない。 このDBにはテーブルが70件あるのですが、70件分のcsvを作成する必要があるということですか?
sazi

2019/02/13 06:34

sys.objectsはSQLServerのシステムカタログです。 管理しているテーブルなどのオブジェクト一覧で中身ではありません。
sazi

2019/02/13 06:37 編集

CSVってヘッダーにある名前や項目数は同じですよね。 70個のテーブルのレイアウトは同じなんですか? 仮に同じでも、それを一つのファイルに纏めたら、どう振り分けるつもりですか?
maam

2019/02/13 06:45

70個のテーブルのレイアウトはバラバラです。 70個分のCSVファイルを作成しないといけませんね…
sazi

2019/02/13 06:54

バックアップ/リストアでは不都合があるのでしょうか?
maam

2019/02/13 07:14

その考えがありませんでした>< バックアップ/リストアで方法を調べてみます。
YAmaGNZ

2019/02/13 07:24

横からですが、bcpという手もありかと思います。
maam

2019/02/13 07:25

それはバルクインサートと同じような処理のことですか??
sazi

2019/02/13 07:44 編集

> YAmaGNZ さん 70個のテーブルという事で、バックアップ/リストア時にテーブルを指定できますし、ファイルは一つの方が良いのでは無いかと思った次第
YAmaGNZ

2019/02/13 07:57 編集

>saziさん 質問の元がバッチファイルでの実行だったので、日次処理的な感じでスケジューラなどでの実行も視野にあるのかと思い、バッチで簡単に使えるbcpも選択肢として考えたほうがいいのかと提案してみました。
guest

0

2点気になります。的外れだったらゴメンナサイ。

  • SQL実行コマンドの引数にある「%root_dir%DATA.SQL」ですが、スラッシュかバックスラッシュで区切らないと不正なパスになりませんか?(上段のif文にあるようにスラッシュ区切りにしないとダメでは?)
  • 冒頭でroot_dirを定義していますが、パス文字列をシングルクォーテーションで囲ってしまうと、パス文字列にシングルクォートが入るように思います。下記のようにしてみてどういう文字列がパスとして表示されるか確認してみてください(説明/例示用にシングルクォーテーションで囲われているのなら勘違いです。ごめんなさい)。
set root_dir='c:\test' echo %root_dir%DATA.SQL

たぶん、こう書かないとだめなんじゃないでしょうか

%root_dir%\DATA.SQL

あと、Output.csvがQutputになってますよ……

投稿2019/02/13 06:21

backyard

総合スコア534

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

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

maam

2019/02/13 06:33

ご回答ありがとうございます。 質問の説明用で、パスの中身や¥を省略していました…わかりにくくてすみません… シングルクォーテーションについても同様です><
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問