dbext似乎认为(是一个sql语句终止符

时间:2013-05-12 22:07:23

标签: sql vim dbext

我在缓冲区的.sql文件中有这个:

 CREATE TABLE WH.dbo.customer(
        id              INTEGER NOT NULL,
        cust_name       VARCHAR(30) NOT NULL,
        phone_nbr       VARCHAR(30) NULL,
        PRIMARY KEY(id)
    );

如果我处于正常模式并且光标在TABLE上,那么我可以命中<Leader>se或命令gVim到:DBExecSQLUnderCursor,并且该语句应该以dbext执行找到CREATE;,然后在两者之间执行脚本。但我收到以下消息:

Last SQL:
CREATE TABLE WHAnalysis.dbo.customer(

如果我突出显示所有脚本并从插件菜单中选择执行SQL(视觉选择),那么它运行正常。

发生了什么事?可以是_vimrc中的设置吗?:

set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()

" Use CTRL-S for saving, also in Insert mode
:nnoremap <C-S>     :<C-U>update<CR>
:vnoremap <C-S>     :<C-U>update<CR>gv
:cnoremap <C-S>     <C-C>:update<CR>
:inoremap <C-S>     <C-O>:update<CR>

" Microsoft SQL Server
let g:dbext_default_profile_WH = 'type=SQLSRV:user=dbuser:passwd=dbuserpassword:dsnname=SQLOLEDB.1:srvname=dwdb'

set nocp
call pathogen#infect()
syntax on
filetype plugin indent on

"Mouse and backspace
set mouse=a

function MyDiff()
  let opt = '-a --binary '
  if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
  if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
  let arg1 = v:fname_in
  if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
  let arg2 = v:fname_new
  if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
  let arg3 = v:fname_out
  if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
  let eq = ''
  if $VIMRUNTIME =~ ' '
    if &sh =~ '\<cmd'
      let cmd = '""' . $VIMRUNTIME . '\diff"'
      let eq = '"'
    else
      let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
    endif
  else
    let cmd = $VIMRUNTIME . '\diff'
  endif
  silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction

nnoremap <Leader>p :pyf P:\Computer Applications\Python\

"quick quit command
noremap <Leader>e :quit<CR> "quits the current window



" Rebind <Leader> key
let mapleader = ","

map <Leader>n <esc>:tabprevious<CR>
map <Leader>m <esc>:tabnext<CR

1 个答案:

答案 0 :(得分:2)

我和插件维护者大卫·菲什伯恩谈过 - 我很惊讶他帮助像我这样的新手超时:好人。

最初他建议

  

我相信SQLSRV的cmd终结符是“\ ngo \ n”而不是“;”。

     

如果您想暂时更改它以尝试在此缓冲区运行:   :DBSetOption cmd_terminator =';'

     

再次尝试使用cmd。

     

如果可行,您可以覆盖默认值或更改您的默认值   配置文件覆盖它。

然后回答一些其他相关问题:

  

<强> Q1。什么是“\ ngo \ n”?

     

因为字符串用双引号括起来,所以Vim会对转义进行处理   字符不同。 \ n - 换行符\ n - 换行符

     

因此对于SQL Server来说,这是典型的:

     

创建程序   开始   结束   去

     

实际上是:
  “END \ NGO \ n” 个

     

换句话说,“go”必须在换行符上,只有“go”   线。

     

<强> Q2。我是否只是将以下内容添加到_vimrc中以使其成为永久性的?:

     
    

DBSetOption cmd_terminator =';'

  
     

没有。 :DBSetOption仅用于修改当前缓冲区设置,而不是   永久设置。

     

你可以做的最好的事情是:h dbext.txt。

     

您问题的具体答案在于:h dbext-configure-options

     

5.3数据库特定选项 dbext-configure-options       命令终止符会自动添加到命令之前       发送到数据库。命令选项也会添加到命令中       用于执行语句的行。 &GT;

    dbext_default_SQLSRV_bin               = "osql"
    dbext_default_SQLSRV_cmd_header        = ""
    dbext_default_SQLSRV_cmd_terminator    = "\ngo\n"
    dbext_default_SQLSRV_cmd_options       = '-w 10000 -r -b -n'
    dbext_default_SQLSRV_extra             = ''
     

因此,要永久覆盖.vimrc中的所有缓冲区   添加:
          让g:dbext_default_SQLSRV_cmd_terminator =“;”