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

    技术2022-06-13  103

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

    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

     

     


    最新回复(0)