golang調用sql server proc

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

許久沒寫部落格,近來真有點鬱悶,首先自己水平有限,在成為大牛的路上努力掙紮中,猙獰地掙紮,其次是不滿某些人的某些態度,我覺得態度是很重要的,好,吐槽完畢。

由於項目需要,需要用到sql server。首先golang串連sql server用的是官方推薦的包github.com/denisenkom/go-mssqldb,可以直接go get。golang調用sql server預存程序是比較蛋疼的,沒有什麼方法可以直接調用,所以我自己寫了個方法:

//proc is the proc name//declare is the proc declare with the return values//in is the params in//out is the params out//outparas is the select parametersfunc GetProcSql(proc, declare, in, out string, outparas ...string) string {    _sql := fmt.Sprintf("%v;exec %v %v", declare, proc, in)    var outparam string    for _, out := range outparas {        outparam = fmt.Sprintf("%v,%v=%v OUTPUT", outparam, out, out)    }    outparam = fmt.Sprintf("%v;", outparam)    if out != "" {        _sql = fmt.Sprintf("%v%vselect %v;", _sql, outparam, out)    } else {        _sql = fmt.Sprintf("%v%v", _sql, outparam)    }    return _sql}

原理是這樣的,需要直接發sql語句到資料庫,sql server 是exec proc,mysql是call exec,格式為 exec proc in out,如果只有輸入,沒有輸出結果的話,那麼就完事了。但是,如果需要返回結果集,也就是需要select的話,那麼就小小蛋疼了,網上別人提供了很多說法都行不通,最後有點沒折,問了一下搞c#開發的朋友,然後又研究了一下執行整個預存程序的過程,恍然大悟。
重點: 要返回結果集,那麼就用select,但是select一定要和exec proc一起,否則就無法select到!而且,也是很關鍵的地方,一定要declare!總之,整條語句寫起來確實很奇葩,用query或者queryrow即可執行,簡直讓我有點懷疑人生,但確實是正確的寫法。

小記: 寫sql時,值要用”號保護,欄位名要用“保護,一來防注入,二來這樣寫真的安全,我就被坑過。。

給個樣本:

_sql:=`declare @PersonNo varchar(50), @PersonName varchar(50),@Time varchar(50),@Money decimal(12, 2),@Place varchar(50),@Type varchar(50);exec WEB_Cost_GetData NULL,NULL,N'c123456', @PersonNo=@PersonNo OUTPUT, @PersonName=@PersonName OUTPUT, @Time=@Time OUTPUT,@Money=@Money OUTPUT,@Place=@Place OUTPUT ,@Type=@Type OUTPUT;select @PersonNo;`
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.