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