微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

基于参数执行的存储过程

如何解决基于参数执行的存储过程

我有一个sql Server存储过程

CREATE PROCEDURE spGetValues
    @Value varchar(50) = ‘ALL’,@date datetime
AS
BEGIN
    IF @Value <> 'ALL'
    BEGIN
        SELECT Col1,Col2 
        INTO #TempTable
        FROM NewTable
        WHERE DATEDIFF(day,datecol,@date) = 0
          AND detail = @Value
    END
    ELSE
    BEGIN
        SELECT col1,@date) = 0 
    END
    
    ……../* Use the #TempTable and calculate */

END

我遇到错误

数据库中已经有一个名为#TempTable的表

如何避免这种情况?

解决方法

我建议将它们合并为一个语句:

select Col1,Col2 into #TempTable
from NewTable
where datediff(day,datecol,@date) = 0 and
      (detail = @Value or @Value = 'All')

如果要针对每个参数值进行优化,则可以添加option (recompile)

但是,如果要考虑性能,那么我建议将逻辑写为:

where datecol >= @date and
      datecol < dateadd(day,1,@date) and
      (detail = @Value or @Value = 'All')

或:

where convert(date,datecol) = @date 
      (detail = @Value or @Value = 'All')

这两种方法都可以利用(datecol)上的索引。

,

要快速入门,您可以在proc的开头添加语句DROP TABLE IF EXISTS #TempTable。该表存在的可能原因是该表超出范围时,在删除该表之前proc被中断。制作D.I.E.快速,简单且无成本(如果存在,则删除)。像这样

CREATE PROCEDURE spGetValues
    @Value varchar(50) = ‘ALL’,@date datetime
AS
BEGIN
    IF OBJECT_ID('tempdb..#TempTable') IS NOT NULL 
         DROP TABLE #TempTable;

    IF @Value <> 'ALL'
    BEGIN
        SELECT Col1,Col2 
        INTO #TempTable
        FROM NewTable
        WHERE DATEDIFF(day,@date) = 0
          AND detail = @Value
    END
    ELSE
    BEGIN
        SELECT col1,@date) = 0 
    END
    
    ……../* Use the #TempTable and calculate */

END

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。