有关存储过程的几个知识点总结
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_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的区别请参阅:/article/5067203.html
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的区别请参阅:/article/5067203.html
相关文章推荐
- JavaScript 提高性能的几个知识点总结
- 有关UIView、subview的几个基础知识点-IOS开发 (实例)(转)
- iOS几个小知识点的总结
- JavaScript 总结几个提高性能知识点
- 【学习日记】有关java的IO的知识点总结
- UI学习总结--几个比较重要的知识点
- 有关密码本小项目的一些知识点总结(二)
- CSS中几个与换行有关的属性简明总结
- 有关UIView、subview的几个基础知识点-IOS开发 (实例)
- JavaScript 总结几个提高性能知识点(转)
- 有关OpenCV1.0中GUI命令的几个函数学习总结
- 有关UIView、subview的几个基础知识点-IOS开发 (实例)
- 有关UIView、subview的几个基础知识点-IOS开发 (实例)
- 学习项目总结的几个知识点
- 与线程有关的知识点总结 java
- 有关UIView、subview的几个基础知识点-IOS开发 (实例)
- 有关数据库存储过程编写的经验总结
- 窥探 kernel --- 有关系统调用的几个知识点
- JavaScript开发中几个常用知识点总结
- 有关View的几个基础知识点-IOS开发