苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 8904|回复: 12

[其他] sp_executesql 用法

[复制链接]
发表于 2013-4-23 21:03:28 | 显示全部楼层 |阅读模式
本帖最后由 记忆 于 2013-4-23 21:08 编辑

我写了一个存储过程NRSPay
  1. /*设备充值存储过程*/
  2. if exists (select * from sysobjects where name='NRSPay')
  3. drop procedure NRSPay
  4. GO
  5. Create procedure NRSPay
  6. @BH varchar(50),      ---设备编号
  7. @balance float         ---充值费用
  8. AS
  9. declare
  10. @MX  nvarchar(50),                ---未交费起始月份
  11. @YX  nvarchar(50),                ---未交费的年份
  12. @NX varchar(20),              ----未交费起始于月标准费用
  13. @sql nvarchar(1000),
  14. @sql1 nvarchar(1000),
  15. @ParmDefinition nvarchar(max);
  16. BEGIN
  17. select top 1  @MX =
  18. (case
  19. when TariffList_PayStatus_1 = 0 then 1
  20. when TariffList_PayStatus_2 = 0 then 2
  21. when TariffList_PayStatus_3 = 0 then 3
  22. when TariffList_PayStatus_4 = 0 then 4
  23. when TariffList_PayStatus_5 = 0 then 5
  24. when TariffList_PayStatus_6 = 0 then 6
  25. when TariffList_PayStatus_7 = 0 then 7
  26. when TariffList_PayStatus_8 = 0 then 8
  27. when TariffList_PayStatus_9 = 0 then 9
  28. when TariffList_PayStatus_10 = 0 then 10
  29. when TariffList_PayStatus_11 = 0 then 11
  30. when TariffList_PayStatus_12 = 0 then 12
  31. else
  32. 0
  33. end),@YX=TariffList_Year
  34. from LifeCycle.dbo.PM_TariffList where NRS_NO = @BH
  35. order by TariffList_Year
  36. print(@MX)--打印查到的月份
  37. print(@YX)--打印查到的年份
  38. set @sql1=N'select  @NX1 =TariffList_Norm_'+@MX+' from LifeCycle.dbo.PM_TariffList where TariffList_Year=@YX1';
  39. print(@sql1)
  40. set @ParmDefinition=N'@YX1 int,@NX1 varchar(20) output';
  41. print(@ParmDefinition)

  42. exec sp_executesql @sql1,@ParmDefinition,@YX1=@YX,@NX1=@NX output;
  43. print(@NX)
  44. END
复制代码
调用:
EXEC NRSPay @BH='C234008',@balance='100'

测试结果有问题
结果如下:
2
2001
select  @NX1 =TariffList_Norm_2 from LifeCycle.dbo.PM_TariffList where TariffList_Year=@YX1
@YX1 int,@NX1 varchar(20) output


问题在于  :print(@NX)没有显示结果,我不知道问题在哪,sp_executesql  第一次使用,不知道是不在sp_executesql  写错了,请大大们指教???

我主要的目的就是想将查出来的TariffList_Norm_ @MX字段值赋给@NX(里面有两个变量是不是只能使用sp_executesql啊



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-4-23 21:13:25 | 显示全部楼层
 楼主| 发表于 2013-4-23 21:33:53 | 显示全部楼层
本帖最后由 记忆 于 2013-4-23 21:48 编辑
站长苏飞 发表于 2013-4-23 21:13
http://www.sufeinet.com/thread-372-1-1.html 参考下这个
  1. print(@MX)--打印查到的月份
  2. print(@YX)--打印查到的年份
  3. set @sql1='select  @NX =TariffList_Norm_'+@MX+' from LifeCycle.dbo.PM_TariffList where TariffList_Year='+@YX;
  4. exec sp_executesql @sql1,N'@NX varchar(20) out ',@NX output

  5. print @sql1
  6. print @NX
复制代码
我按照你的方法换成这样还是读不出来啊,
打印出的结果:
2
2001
select  @NX =TariffList_Norm_2 from LifeCycle.dbo.PM_TariffList where TariffList_Year=2001
 楼主| 发表于 2013-4-23 21:39:24 | 显示全部楼层
发表于 2013-4-24 07:52:00 | 显示全部楼层
记忆 发表于 2013-4-23 21:33
我按照你的方法换成这样还是读不出来啊,打印出的结果:
2
2001

print @NX 写在外外肯定不行啊,executesql 执行完成之后会执行批处理,上面和下面的变量和这个无关的,相当于两个存储过程。怎么可能会赋值呢,你的print要写在Sql语言中才行
 楼主| 发表于 2013-4-24 11:06:16 | 显示全部楼层
站长苏飞 发表于 2013-4-24 07:52
print @NX 写在外外肯定不行啊,executesql 执行完成之后会执行批处理,上面和下面的变量和这个无关的,相 ...

不是很明白啊
发表于 2013-4-24 11:09:11 | 显示全部楼层
记忆 发表于 2013-4-24 11:06
不是很明白啊

select  @NX =TariffList_Norm_2 from LifeCycle.dbo.PM_TariffList where TariffList_Year=2001
打印出来的这个语句对吗?
 楼主| 发表于 2013-4-24 11:10:29 | 显示全部楼层
站长苏飞 发表于 2013-4-24 11:09
select  @NX =TariffList_Norm_2 from LifeCycle.dbo.PM_TariffList where TariffList_Year=2001
打印出 ...

对啊
 楼主| 发表于 2013-4-24 11:11:37 | 显示全部楼层
然后我就是想将字段TariffList_Norm_2的值赋给@NX,就是这样啊,但是@NX没有收到值
发表于 2013-4-24 11:33:40 | 显示全部楼层
记忆 发表于 2013-4-24 11:11
然后我就是想将字段TariffList_Norm_2的值赋给@NX,就是这样啊,但是@NX没有收到值

你详细看看我写的例子,第一个参数就是你动态拼的sql1 这个Sql语句必须是nvarchar类型啊,可你写的是Varchar那肯定会报错的。你修改成Nvarchar试试吧
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-26 04:09

© 2014-2021

快速回复 返回顶部 返回列表