【コマンドプロンプト】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
関連記事
-
-
【コマンドプロンプト】前日日付、月末日付を変数に取得するバッチ。うるう年対応
コマンドプロンプトを使って前日、指定日、月末日付を変数に取得する。 「SearchDay」に入
-
-
【コマンドプロンプト】バッチファイルでCSVを1行ずつ処理をする方法
僕はプログラマーではないので、あまりカッコイイプログラムはかけませんが、CSVファイルを1行ずつ、バ
-
-
【ODBC】Access2007でSQL Server 2012に接続する為のサーバー側の設定
ODBCでAccess2007からSQL Server 2012へ接続する為には SQL Serv
-
-
【コマンドプロンプト】32bit以上の計算をする方法(引き算)
コマンドプロンプトで計算するときに「Set /a ~」で計算式を使うと符号付32bitの間でしか計算
-
-
【SQLServer2012】バックアップ/リストア方法 リストア編
SQL Server 2012のデータベースをManagement Studioを使用して、リストア
-
-
【SQL Server】Excel VBAでSELECT文を実行してレコードセットへ取得
前回は、テーブルのレコードをVBAで直接更新(Insert/update/delete) 今回
-
-
【SQL Server】バックアップ取得日を確認する方法
前回の記事で、SQL Serverのデータベースのリストアした日付を確認するSQLを作りましたが、今
-
-
【コマンドプロンプト】前後の不要なスペースの除去(取り除く)
コマンドプロンプトのFOR文とか使って変数に取得しようとすると、取得元のコマンドとかファイルによって
-
-
【SQL Server 2012】Management Studioを使ったバックアップで面白い機能。
Management Studioを使ったバックアップをかれこれ3年くらいやってるんですが、一つのバ
-
-
【SQL Server】エクセルをテーブルに取り込む方法
以前にManagement Studioを使ってSQLでエクセルを直接取り込む方法を書きましたが、今
Comment
MSって、SQLCMDとPOWERSHELLの関係など、こういう連携をなんで考えないでしょうか?
いろいろ勝手に新しいものを出すんだけど、既存のものとの関係などはどうでもいいのでしょうかね?