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

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

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

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

バッチファイル

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

Q&A

解決済

2回答

11094閲覧

テーブルの中の件数をバッチに返したい

iorin

総合スコア32

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

バッチファイル

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

0グッド

0クリップ

投稿2019/06/11 08:43

編集2019/06/12 02:47

バッチでSQLServerに接続し、テーブルの件数によって処理を分岐させたいです。

まず、前提として日次で処理が行われます。
最新のデータだけにしたいため、前日取り込んだデータをtruncateしてcsvファイルのデータを取り込みます。

しかし、csvファイルに不備があって正常に取り込めなかった場合、truncateまでは実行してしまうため、テーブルの中身が空になってしまいます。

上記のような事態が発生した場合の回避策を考えております。

batchで実行するため、トランザクションを切るのが難しいかと思いました。
そのため、一度、一時物理テーブルにデータを格納し、正しく取り込めた(件数が1件以上あれば正常取り込みとする)場合は、本当に取り込みたいテーブルに再度同じcsvを取り込もうと思いましたが、件数が1件以上あるかの判断が出来ません。

以下のコマンドだと

call sqlcmd -S %SERVER% -E -i %SQLFilename% -v InputFileNameS=%InputF% FormatFileNameS=%FormatF% TableNameS=%TableN% DatabaseNameS=%DATABASENAME% >> %LogFilename%

このような結果が返ってきます。
LogFilenameにはファイルパスが格納してあり、そのファイルに出力されてしまいます。

----------- 10 (1 行処理されました)

実際に使いたいのは「10」だけなのでcount結果を引数として渡したいのですが、可能でしょうか。

他にもっと簡単に回避できる策があったら教えてください。

バージョンは
Microsoft SQL Server 2017 - 14.0.3045.24 (X64)
です。

よろしくお願い致します。

追記

call sqlcmd -S %SERVER% -E -i %SQLFilename% -v InputFileNameS=%InputF% FormatFileNameS=%FormatF% TableNameS=%TableN% DatabaseNameS=%DATABASENAME% >> %LogFilename% pause call sqlcmd -S %SERVER% -E -d %DATABASENAME% -Q "EXIT(SELECT COUNT(*) FROM %TableN%)" echo %errorlevel% pause

上記のような処理を組み込んでみましたが %errorlevel% に件数以外も表示されてしまうに見えます。
以下のように表示されます。

続行するには何かキーを押してください . . . ----------- 16883 (1 行処理されました) 0 続行するには何かキーを押してください . . .

記述が間違えていますでしょうか。

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

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

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

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

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

guest

回答2

0

sql

1EXIT(SELECT COUNT(*) FROM 'テーブル名')

EXITで処理件数をリターンコードに指定し、呼び元のバッチから%errorlevel%で取得します。

投稿2019/06/11 08:56

編集2019/06/11 09:31
ryo_y

総合スコア244

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

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

iorin

2019/06/12 02:49

ご回答ありがとうございます。 試してみたのですが、記述が間違えているのか上手くいきません。 質問に追記したのでご教授頂けないでしょうか。
sazi

2019/06/12 12:21 編集

@ryo_yさん errorlevel は、call sqlcmdを実行した結果にしか過ぎず、sqlcmdの実行内容の結果とは違うのではないですか?
iorin

2019/06/12 08:37

echoで確認すると空白行や不要な行が表示されてしまいます。
guest

0

ベストアンサー

batchで実行するため、トランザクションを切るのが難しいかと思いました。

SQLファイルの内容を実行しているんでしょうから、その中でトランザクション制御を行い、エラーを拾って分岐すれば良いかと思います。
エラーがSQLステートに該当するものなら、TRY...CATCH (Transact-SQL)が使用できます。

投稿2019/06/11 08:53

編集2019/06/11 09:02
sazi

総合スコア25197

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

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

iorin

2019/06/12 02:52

ご回答ありがとうございます。 BULK INSERT を使用してデータを取り込んでいるのですが、そのSQLでTryCatchを使用するということでしょうか。
sazi

2019/06/12 02:58

sqlcmd で実行可能なものは単独のSQLに限りません。 T-SQLとしても実行可能なので、SQL文毎にファイルを分けるのではく、一連の処理は一つのSQLファイルに纏めた方が効率的ですよ。
iorin

2019/06/12 08:35

アドバイスありがとうございます。 今回の処理を行いたいのは1つのテーブルではなく、複数あります(今後増える予定もあります)。 現在は、最初に全てのテーブルをtruncateし、batch内のfor文でBLUK INSERTのクエリを回しています。 仮に4テーブルに同様の処理を行おうとしたときに、1,2,3は上手くいき、4番目で上手くいかなかった場合は、1,2,3のテーブルの処理もなかったことにしたいのです。 出来ればプロシージャー等は使いたくないのですが、SQL内でループすることなどは可能なのでしょうか。 ご教授頂けると助かります。 よろしくお願いします。
sazi

2019/06/12 12:20

それらは一連の処理なので、尚更一つのトランザクション内で行うべきです。 T-SQLというのは、ストアドプロシージャなどで利用できるもので、プロシージャを作成せずにプロシージャの内部で行っているような処理を直接実行できます。 公式では理解しづらいと思いますので、以下などを一読下さい。 T-SQL 入門(https://sql55.com/t-sql/)
iorin

2019/06/13 01:31

ご回答ありがとうございます。 私も1つのトランザクションで行うべきだとは思うのですが、前任者が分けて作成してしまっているため、出来ればこれを崩さずに使用したいと思った次第です。 >T-SQLというのは、ストアドプロシージャなどで利用できるもので、プロシージャを作成せずにプロ >シージャの内部で行っているような処理を直接実行できます。 この部分がよくわからないのですが、SQL Server Management Studio でプロシージャーを作らなくても、Windowsバッチ内で記述が可能なのでしょうか。 URLのご提示もありがとうございました。
sazi

2019/06/13 14:45

SQLSERVER以外のDBの経験はありますか?
iorin

2019/06/14 00:31

MySQLなら少しだけやったことありますが、あまり難しいことはやったことないです。
sazi

2019/06/14 07:28

MySQLでもプロシージャを作らずにif文などの制御文が実行できるのですが、ご経験は無さそうですね。 > SQL Server Management Studio でプロシージャーを作らなくても、Windowsバッチ内で記述が可能なのでしょうか。 SQLCMD経由でSQLファイルを実行する事で可能です。
iorin

2019/06/14 08:51

色々とご教授頂きありがとうございました。 1つのトランザクションで処理するようにして頑張ってみます。 また何かありましたら、質問させて頂くかもしれませんが、よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問