【コマンドプロンプト】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
関連記事
-
【コマンドプロンプト】完成版!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)を発行
Comment
MSって、SQLCMDとPOWERSHELLの関係など、こういう連携をなんで考えないでしょうか?
いろいろ勝手に新しいものを出すんだけど、既存のものとの関係などはどうでもいいのでしょうかね?