为了账号安全,请及时绑定邮箱和手机立即绑定

怎么能传一条sql 到存储过程中?

怎么能传一条sql 到存储过程中?

人到中年有点甜 2018-12-03 17:12:02
怎么能传一条sql 到存储过程中?
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

1. 组装的SQL语句错了:你的语句中将字符串类型跟表类型加到一起了。 2. 表变量的使用方式错误:作用域的问题。 3. 表变量的使用方式不正确:表变量存储方式的问题。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 你的这个SQL语句并没有涉及表变量的其他问题,因此这里就以上几个问题来修正你的代码。 仅修正问题1、2: declare @tb table(byer ntext not null,fare money not null) ------> create table #tb (byer ntext not null,fare money not null) exec (N'insert '+@tb+''+@sqlone) ------> exec (N'insert '+'#tb '+@sqlone) 后面相应的@tb全部改为#tb,即可 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 上面的写法有不少的性能问题,不管是SQL语句本身还是整个方案,包括我上面给出的修改方案。所以,现在考虑修正第3个问题 下面给出一个稍微好一些的写法(注意,方案本身的缺陷只能根据你的实际业务来解决了)整个存储过程可以修改为以下形式: EXEC (N'SELECT SUM(dbo.f_split(byer,'','')) AS number, SUM(fare) AS Totmoney FROM (' + @sqlone + ') AS A') 里面的byer和fare需要你自己再调整,那就看你传入的SQL语句中的字段命名是怎么样的了。 这样修改之后,能够避免一些不必要的性能损失。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 最后补充一点:修改后的方案虽然会比之前的好一些,不过整体方案仍然不是很合理,而且这样的存储过程还会降低应用程序的可维护性。建议在今后的设计中尽量不要使用这样的方案。

查看完整回答
反对 回复 2018-12-07
?
长风秋雁

TA贡献1757条经验 获得超7个赞


你这种方式定义的@tb是一个表变量,当使用EXEC(@sql)后,@tb表变量就被自动销毁,无法再被访问了。 如果希望在EXEC(@sql)之后能继续被访问,可以采用创建局部临时表(#)的方式。


查看完整回答
反对 回复 2018-12-07
  • 2 回答
  • 0 关注
  • 592 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信