有关存储过程的几个知识点总结

这两天就写存储过程遇到些问题,现在总结如下:希望给我遇到同样问题的朋友一点帮助,如有错误的地方,希望得到大家指正共同学习。

1.有关类型转换求和

 select SUM(CAST('123' AS FLOAT))----123

 select SUM(CAST('' AS FLOAT))----0

 select SUM(CAST(null AS FLOAT))----null

 

2.有关临时表的问题

  大伙都知道临时表示用一个#,全局表用两个##

select * into #TEMPx    from dbo.Collection 

 

 

declare @STR NVARCHAR(MAX)

set @STR='select convert(char(10),wb.Createdtm ,120) as data,Count(1) as numCount into ##TEMPx    from dbo.Collection ct  left join WaybillInfor2 wb     on ct.WaybillID=wb.WaybillID  left join WaybillAssign wa on wa.WaybillID=wb.WaybillID where  1=1  ' + @SQL + '    group by convert(char(10),wb.Createdtm ,120) '

EXEC (@STR)

 

 

当我们需要借助临时表来暂时存储数据是,但是如上的第二段查询语句中有变量的时候,就不行了,此事需要借助exec,而是此时也需要改为改为全局表。

 

3.SQLServer : EXEC和sp_executesql的区别

 

EXEC除了不支持动态批处理中的输入参数外,他也不支持输出参数。默认情况下,EXEC把查询的输出返回给调用者。当我们需要输出一定值的时候这是后就不行了,此是我们需要使用sp_executesql:比如下面的语句

 

 

declare @SQLWHERE char(10), @SQL varchar(1000), @FEIGHT int

set @SQL = N' and wb.Destinations=''11217461 '' and (ct.Createdtm between ''2011-05-23 00:00:00'' and ''2011-05-30 23:59:59'')'

set @SQLWHERE ='2011-05-09'

 

set @SQL = 'SELECT @A = SUM(CAST(wb.Freight AS FLOAT)) FROM WAYBILLINFOR2 wb inner join collection ct on wb.WaybillID= ct.WaybillID WHERE CONVERT(CHAR(10),wb.CREATEDTM,120)='''+@SQLWHERE+''' and wb.PayMode=''20101218190'''+@SQL

exec sp_executesql @SQL,N'@A int output',@FEIGHT output 

 

 

(此问题的解决多亏了jxqn_liumaco_wang两位牛人的帮助,问题缘由可以查阅http://topic.csdn.net/u/20110531/11/0daaea0c-7c67-40df-a54a-43ff50c05f82.html?seed=176014441&r=73603259#r_73603259

建议在执行字符串时,使用 sp_executesql 存储过程而不要使用 EXECUTE 语句。由于此存储过程支持参数替换,因此 sp_executesql 比 EXECUTE 的功能更多;由于 SQL Server 更可能重用 sp_executesql 生成的执行计划,因此 sp_executesql 比 EXECUTE 更有效。

 

有关使用 sp_executesql请参阅:http://technet.microsoft.com/zh-cn/library/ms175170.aspx

 

 

EXEC和sp_executesql的区别请参阅:http://www.cnblogs.com/xbf321/archive/2008/11/02/1325067.html

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值