您的位置:首页 > 其它

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

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

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的区别请参阅:/article/5067203.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: