【コマンドプロンプト】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では、テーブルのレコード数をカウントした結果をリターン値として取得していますが、うまく値を取得することができて、変数として扱っています。
ただし!このバッチには問題がたくさんありますorz
その1.リターン値に数値しか扱えない。
文字列は取得できません。文字列の数字の「1」などは取得できます。文字列の「01」などは「1」として扱われます。リターン値なので、当然ちゃ当然ですね。。
その2.select文のカラム1つしか取得できません。
カラムが複数ある場合は、先頭カラムのみしか取得できません。
その3.select結果の最終行しか取得できません。
select結果が2行以上ある場合は、最終行のみ取得できます。
その4.符号付32bit以上の数値は扱えません。
つまり「2147483647」までです。これはSQLというか、コマンドプロンプトの問題です。コマンドプロンプトでは「2147483647」以上の数値を扱えないため、「無効な数字です。数値は 32 ビットで表記される数値です。」と表示されてしまいます。
と、色々制約?があり、ちょっと使いづらいですが、いちよーSQLの結果を直接、変数に格納することができたので、メモしておきます。
ちなみにSQL SERVER 2008と2012での動作は確認しました。
色々探して、さらに良い方法を見つけたいと思います。
Adsense
関連記事
-
【SQL Server 2012】バッチ(コマンドプロンプト)でバックアップ
バッチ(コマンドプロンプト)を使って、SQL Server 2012のバックアップを取得します。
-
【コマンドプロンプト】前日日付、月末日付を変数に取得するバッチ。うるう年対応
コマンドプロンプトを使って前日、指定日、月末日付を変数に取得する。 「SearchDay」に入
-
【SQL Server】Excel VBAでSQLを実行し、レコードを更新(追加、更新、削除)する
VBAでSQL Serverのテーブルに SQL(Insert、Update、Delete)を発行
-
【SQL Server】データベース作成日時(リストアした日付)を確認する方法
トラブルの調査をするとき、開発用の環境を作成して、調査するのですが… この環境っていつ作成した
-
【コマンドプロンプト】32bit以上の計算をする方法(引き算)
コマンドプロンプトで計算するときに「Set /a ~」で計算式を使うと符号付32bitの間でしか計算
-
【SQL Server 2012】Management Studioでサンプルデータベース(mdfファイル)をアタッチ
以前、Windows Server 2012にMicrosoftR SQL ServerR 2012
-
【Management Studio】テーブル単位のメモリ使用量の確認
1.Management Studioを起動し、メモリ使用量が確認したい対象サーバーへ接続 2.確
-
【SQL Server 2012】SQLでエクセルをテーブルとして表示させる方法
SQL Management Studioを使用してインポート等は使用せずにSQLのみでテーブルを表
-
【コマンドプロンプト】バッチファイルでCSVを1行ずつ処理をする方法
僕はプログラマーではないので、あまりカッコイイプログラムはかけませんが、CSVファイルを1行ずつ、バ
-
【SQL Server 2012】SQLでエクセル表示の実行エラーの対処法
SQLでエクセル表示を実行した時にエラーとなった場合の対処法。 実はSQLでエクセルファイルを表示
Comment
MSって、SQLCMDとPOWERSHELLの関係など、こういう連携をなんで考えないでしょうか?
いろいろ勝手に新しいものを出すんだけど、既存のものとの関係などはどうでもいいのでしょうかね?