【コマンドプロンプト】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
関連記事
-
-
【コマンドプロンプト】バッチでセクション付のINIファイルの読み込み
バッチファイルでINIファイルから値を読み込む 1.INIファイルの用意 以下の「バッチファイル
-
-
【SQL Server 2012】Management Studioでサンプルデータベース(mdfファイル)をアタッチ
以前、Windows Server 2012にMicrosoftR SQL ServerR 2012
-
-
【SQL Server 2012】Management Studioを使ったバックアップで面白い機能。
Management Studioを使ったバックアップをかれこれ3年くらいやってるんですが、一つのバ
-
-
【コマンドプロンプト】前後の不要なスペースの除去(取り除く)
コマンドプロンプトのFOR文とか使って変数に取得しようとすると、取得元のコマンドとかファイルによって
-
-
【コマンドプロンプト】32bit以上の計算をする方法(引き算)
コマンドプロンプトで計算するときに「Set /a ~」で計算式を使うと符号付32bitの間でしか計算
-
-
【コマンドプロンプト】バッチファイルでCSVを1行ずつ処理をする方法
僕はプログラマーではないので、あまりカッコイイプログラムはかけませんが、CSVファイルを1行ずつ、バ
-
-
【コマンドプロンプト】前日日付、月末日付を変数に取得するバッチ。うるう年対応
コマンドプロンプトを使って前日、指定日、月末日付を変数に取得する。 「SearchDay」に入
-
-
【SQL Server】Excel VBAのレコードセットを使ってテーブルの一括更新
前々回は読み取り専用でレコードセットへ取得し、結果をエクセルへ書き出し 前回はVBAから更新S
-
-
【SQLServer2012】バックアップ/リストア方法 リストア編
SQL Server 2012のデータベースをManagement Studioを使用して、リストア
-
-
【Management Studio】Microsoft SQL Server 2012 ExpressにManagement Studio のインストール方法。
前回、Windows Server 2012にSQL Server 2012 Expressをインス


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