*

【コマンドプロンプト】cmdでSQLの結果を変数に取得する方法

力技の取得方法をご紹介。というかメモ。

題名には偉そうに書きましたが…なかなか良い方法が見つかりませんでした。探すと一度テキストに落として、そこからfor文を使って変数に取り込むというのはあるのですが、直接コマンドプロンプト上の変数に入れる方法うまく見つけられませんでした。

ストアドを作って~ とかもあったのですが、本番のDBにストアドを作成するには、うちの職場は申請とかが必要なので。。

ということで、下記のバッチを作成。

echo offsqlcmd -S 【接続サーバ名】 -E -d 【接続データベース名】 -h -1 -Q “EXIT(set nocount on;select count(*) from 【テーブル名】)”
SET STAT= %ERRORLEVEL%echo リターン値:%STAT%

pause

 

力技ではなく、きちんと変数に取り込みたい場合は、こちら

 

ポイントは、sqlcmdのオプション「-Q」の赤文字です。

解説しますと、”EXIT()“で囲むことで、ERRORLEVELにリターン値として格納することができます。また、”set nocount on“で「(1 行処理されました)」と表示されるところを表示されないようにしています。

上記のように、書くことで ERRORLEVELにリターン値を入れてます。

で、結果が↓です。

SQLの結果をコマンドプロンプトの変数に直接取得

SQLの結果をコマンドプロンプトの変数へ直接取得

このSQLでは、テーブルのレコード数をカウントした結果をリターン値として取得していますが、うまく値を取得することができて、変数として扱っています。

ただし!このバッチには問題がたくさんありますorz

その1.リターン値に数値しか扱えない。

文字列は取得できません。文字列の数字の「1」などは取得できます。文字列の「01」などは「1」として扱われます。リターン値なので、当然ちゃ当然ですね。。

その2.select文のカラム1つしか取得できません。

カラムが複数ある場合は、先頭カラムのみしか取得できません。

その3.select結果の最終行しか取得できません。

select結果が2行以上ある場合は、最終行のみ取得できます。

その4.符号付32bit以上の数値は扱えません。

つまり「2147483647」までです。これはSQLというか、コマンドプロンプトの問題です。コマンドプロンプトでは「2147483647」以上の数値を扱えないため、「無効な数字です。数値は 32 ビットで表記される数値です。」と表示されてしまいます。

 

と、色々制約?があり、ちょっと使いづらいですが、いちよーSQLの結果を直接、変数に格納することができたので、メモしておきます。

ちなみにSQL SERVER 2008と2012での動作は確認しました。

色々探して、さらに良い方法を見つけたいと思います。

 

Adsense

関連記事

データベース

【コマンドプロンプト】完成版!cmdでSQLの結果を変数に取得

以前、 【コマンドプロンプト】cmdでSQLの結果を変数に取得する方法 を書きましたが、

記事を読む

データベース

【SQL Server 2012 Express】Windows Server 2012にインストールしてみる

Windows Server 2012にSQL Server 2012をインストールしてみる。 以

記事を読む

データベース

【レプリケーション】SQL Server 2012 Expressでレプリケーション

Windows Server 2012のSQL Server 2012 Expressを二台用意して

記事を読む

コマンドプロンプト

【コマンドプロンプト】32bit以上の計算をする方法(引き算)

コマンドプロンプトで計算するときに「Set /a ~」で計算式を使うと符号付32bitの間でしか計算

記事を読む

コマンドプロンプト

【コマンドプロンプト】前後の不要なスペースの除去(取り除く)

コマンドプロンプトのFOR文とか使って変数に取得しようとすると、取得元のコマンドとかファイルによって

記事を読む

コマンドプロンプト

【コマンドプロンプト】前日日付、月末日付を変数に取得するバッチ。うるう年対応

コマンドプロンプトを使って前日、指定日、月末日付を変数に取得する。 「SearchDay」に入

記事を読む

データベース

【SQL Server】Management Studioを使ったトランザクションログファイルの圧縮

「ファイルが書き出せない」と問い合わせを受け、DBサーバーのマイコンピュータ確認したら、Dドライブ(

記事を読む

コマンドプロンプト

【コマンドプロンプト】改行コード CR、LF、CRLFの出力とテキスト書き出し。

仕事でバッチファイルを使っているとログ出力が非常に大事になる。 細かくログを出すことによって、

記事を読む

データベース

【SQL Server】Excel VBAのレコードセットを使ってテーブルの一括更新

前々回は読み取り専用でレコードセットへ取得し、結果をエクセルへ書き出し 前回はVBAから更新S

記事を読む

データベース

【SQL Server】Excel VBAでSQLを実行し、レコードを更新(追加、更新、削除)する

VBAでSQL Serverのテーブルに SQL(Insert、Update、Delete)を発行

記事を読む

Adsense

Comment

  1. じいさん より:

    MSって、SQLCMDとPOWERSHELLの関係など、こういう連携をなんで考えないでしょうか?
    いろいろ勝手に新しいものを出すんだけど、既存のものとの関係などはどうでもいいのでしょうかね?

じいさん へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Adsense

Microsoft Office
【Access】削除クエリの「指定されたテーブルから削除できませんでした。」の対処法

削除クエリで「指定されたテーブルから削除できませんでした。」と ポッ

Microsoft Office
【PowerPoint】表や図形、画像オブジェクトの位置をピッタリ合わせる方法

パワーポイントで、図形や画像等のオブジェクトの細かい位置調整は、 完

データベース
【SQL Server】Excel VBAのレコードセットを使ってテーブルの一括更新

前々回は読み取り専用でレコードセットへ取得し、結果をエクセルへ書き出し

application
【Visual Studio】デバック、ブレークポイントで止まらない。

Visual Studio 2015でVB.netのプログラムをデバッ

データベース
【SQL Server】Excel VBAでSELECT文を実行してレコードセットへ取得

前回は、テーブルのレコードをVBAで直接更新(Insert/updat

→もっと見る

PAGE TOP ↑