加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang调用sql server proc

发布时间:2020-12-16 18:27:11 所属栏目:大数据 来源:网络整理
导读:许久没写博客,近来真有点郁闷,首先自己水平有限,在成为大牛的路上努力挣扎中,狰狞地挣扎,其次是不满某些人的某些态度,我觉得态度是很重要的,好,吐槽完毕。 由于项目需要,需要用到sql server。首先golang连接sql server用的是官方推荐的包github.com

许久没写博客,近来真有点郁闷,首先自己水平有限,在成为大牛的路上努力挣扎中,狰狞地挣扎,其次是不满某些人的某些态度,我觉得态度是很重要的,好,吐槽完毕。

由于项目需要,需要用到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 parameters
func GetProcSql(proc,declare,in,out string,outparas ...string) string {

    _sql := fmt.Sprintf("%v;exec %v %v",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,out)
    } else {
        _sql = fmt.Sprintf("%v%v",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时,值要用”号保护,字段名要用“保护,一来防注入,二来这样写真的安全,我就被坑过。。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读