分享
  1. 首页
  2. 文章

golang调用sql server proc

luomoshusheng · · 2072 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

由于项目需要,需要用到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", 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;`

有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:luomoshusheng

查看原文:golang调用sql server proc

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2072 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏