golang调用sql server proc
2016-09-06 00:54
441 查看
许久没写博客,近来真有点郁闷,首先自己水平有限,在成为大牛的路上努力挣扎中,狰狞地挣扎,其次是不满某些人的某些态度,我觉得态度是很重要的,好,吐槽完毕。
由于项目需要,需要用到sql server。首先golang连接sql server用的是官方推荐的包github.com/denisenkom/go-mssqldb,可以直接go get。golang调用sql server存储过程是比较蛋疼的,没有什么方法可以直接调用,所以我自己写了个方法:
原理是这样的,需要直接发sql语句到数据库,sql server 是exec proc,mysql是call exec,格式为 exec proc in out,如果只有输入,没有输出结果的话,那么就完事了。但是,如果需要返回结果集,也就是需要select的话,那么就小小蛋疼了,网上别人提供了很多说法都行不通,最后有点没折,问了一下搞c#开发的朋友,然后又研究了一下执行整个存储过程的过程,恍然大悟。
重点: 要返回结果集,那么就用select,但是select一定要和exec proc一起,否则就无法select到!而且,也是很关键的地方,一定要declare!总之,整条语句写起来确实很奇葩,用query或者queryrow即可执行,简直让我有点怀疑人生,但确实是正确的写法。
小记: 写sql时,值要用”号保护,字段名要用“保护,一来防注入,二来这样写真的安全,我就被坑过。。
给个示例:
由于项目需要,需要用到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;`
相关文章推荐
- MySQL存储过程
- Go 语言 Channel 实现原理精要
- Go语言将支持Android
- ASP程序与SQL存储过程结合使用详解
- Ruby中使用Block、Proc、lambda实现闭包
- Ruby中的block、proc、lambda区别总结
- Oracle存储过程之数据库中获取数据实例
- MSSQL自身存储过程的一个注入漏洞
- 详解Ruby中的代码块对象Proc
- 推荐Sql server一些常见性能问题的解决方法
- Ruby中的Proc类及Proc的类方法Proc.new的使用解析
- SQL SERVER调用存储过程小结
- SQLServer 2005 列所有存储过程的语句
- SQLServer 2008中的代码安全(一) 存储过程加密与安全上下文
- SQL2005重新生成索引的的存储过程 sp_rebuild
- SQL Server存储过程的基础说明
- sqlserver存储过程语法详解
- MSSQL事务的存储过程
- SQL Server 存储过程解析