【问题标题】:Stored procedure executing based on parameters基于参数执行的存储过程
【发布时间】:2020-10-19 20:18:16
【问题描述】:

我有一个 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, Col2 
        INTO #TempTable
        FROM NewTable
        WHERE DATEDIFF(day, datecol, @date) = 0 
    END
    
    ……../* Use the #TempTable and calculate */

END

我遇到了一个错误

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

如何避免这种情况?

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    我建议将这些组合成一个语句:

    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) 上的索引。

    【讨论】:

    • - 详细信息列中没有“ALL”。
    • @kalls 。 . .我不知道你的评论指的是什么。
    • 我做不到(detail =@value 或@value = 'All'),因为detail 列中没有'ALL'。我正在使用 'ALL' 来排除查询中的条件(不使用 where 子句)
    • @kalls 。 . .该逻辑不是假设detail 具有'All'。它只是比较@value
    【解决方案2】:

    为了快速开始,您可以在 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, datecol, @date) = 0
              AND detail = @Value
        END
        ELSE
        BEGIN
            SELECT col1, Col2 
            INTO #TempTable
            FROM NewTable
            WHERE DATEDIFF(day, datecol, @date) = 0 
        END
        
        ……../* Use the #TempTable and calculate */
    
    END
    

    【讨论】:

    • 谢谢。我没有使用 SQL Server 2016 并且 DROP TABLE IF EXISTS 可从 SQL Server 2016 获得。谢谢。
    • 或者,对于 2016 年之前,您可以通过 object_id 检查并删除是否存在。
    猜你喜欢
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多