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语句中的字段命名是怎么样的了。 这样修改之后,能够避免一些不必要的性能损失。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 最后补充一点:修改后的方案虽然会比之前的好一些,不过整体方案仍然不是很合理,而且这样的存储过程还会降低应用程序的可维护性。建议在今后的设计中尽量不要使用这样的方案。
TA贡献1757条经验 获得超7个赞
你这种方式定义的@tb是一个表变量,当使用EXEC(@sql)后,@tb表变量就被自动销毁,无法再被访问了。 如果希望在EXEC(@sql)之后能继续被访问,可以采用创建局部临时表(#)的方式。
- 2 回答
- 0 关注
- 592 浏览
添加回答
举报