2011/01/11

Emacs でインタラクティブに SQL する (Microsoft SQL Server 2005 編)


下記の設定は Microsoft SQL Server ですが、少し書き換えれば他の RDB でも使えるはずです。
今回対象にしたのは, SQL Server 2005 です。

必要なものは
auto-install で入りました。なかなか便利になりました。
Management Studio は重苦しいので少し不満でした。Emacs キーバインドになりそうもありませんし。Enterprise Manager の軽さが懐かしいです。

以下設定。

.emacs

;; C-c C-c : 'sql-send-paragraph
;; C-c C-r : 'sql-send-region
;; C-c C-s : 'sql-send-string
;; C-c C-b : 'sql-send-buffer
(require 'sql)

(add-hook 'sql-interactive-mode-hook
          #'(lambda ()
              (interactive)
              (set-buffer-process-coding-system 'sjis-unix 'sjis-unix )
              (setq show-trailing-whitespace nil)))

;; starting SQL mode loading sql-indent / sql-complete
(eval-after-load "sql"
  '(progn
     (load-library "sql-indent")
     (load-library "sql-complete")
     (load-library "sql-transform")))

(setq auto-mode-alist
      (cons '("\\.sql$" . sql-mode) auto-mode-alist))

(sql-set-product-feature
 'ms :font-lock 'sql-mode-ms-font-lock-keywords)

(defcustom sql-ms-program "sqlcmd"
  "Command to start sqlcmd by SQL Server."
  :type 'file
  :group 'SQL)

(sql-set-product-feature
 'ms :sql-program 'sql-ms-program)
(sql-set-product-feature
 'ms :sqli-prompt-regexp "^[0-9]*>")
(sql-set-product-feature
 'ms :sqli-prompt-length 5)

(defcustom sql-ms-login-params
  '(user password server database)
  "Login parameters to needed to connect to mssql."
  :type '(repeat (choice
                  (const user)
                  (const password)
                  (const server)
                  (const database)))
  :group 'SQL)

(defcustom sql-ms-options '("-U" "-P" "-S" "-d")
  "List of additional options for `sql-ms-program'."
  :type '(repeat string)
  :group 'SQL)

(defun sql-connect-ms ()
  "Connect ti SQL Server DB in a comint buffer."
  ;; Do something with `sql-user', `sql-password',
  ;; `sql-database', and `sql-server'.
  (let ((f #'(lambda (op val)
               (unless (string= "" val)
                 (setq sql-ms-options
                       (append (list op val) sql-ms-options)))))
        (params `(("-U" . ,sql-user)("-P" . ,sql-password)
                  ("-S" . ,sql-server)("-d" . ,sql-database))))
    (dolist (pair params)
      (funcall f (car pair)(cdr pair)))
    (sql-connect-1 sql-ms-program sql-ms-options)))

(sql-set-product-feature
 'ms :sqli-login 'sql-ms-login-params)
(sql-set-product-feature
 'ms :sqli-connect 'sql-connect-ms)

(defun run-mssql ()
  "Run mssql by SQL Server as an inferior process."
  (interactive)
  (sql-product-interactive 'ms))


初めは osql を使おうとしていたのですが、クエリを投げたあと戻ってきませんでした。。
osql をやめて sqlcmd に変えたらうまく動いたみたいです。

SQL Server の設定


画像のデータは定番の pubs のデータです。

osql, sqlcmd

osql, sqlcmd を単体で使う場合。
>osql -U username -S servername
>osql -U usename -S servername -d pubs -i test.sql
sqlcmd も同様。

Emacs version

Emacs のバージョンは (emacs-version) してみたら
"GNU Emacs 24.0.50.1 (i386-mingw-nt5.1.2600)
of 2010-07-02 on YAMALOK"
でした。

追記

sqli-prompt-regexp のとこと、sql-connect-ms を少し書き換えました。

プログラマのためのSQL 第2版

0 件のコメント:

コメントを投稿