基于参数执行的存储过程

Stored procedure executing based on parameters

我有一个 SQL 服务器存储过程

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

我收到一个错误

There is already a table named #TempTable in the database

如何避免这种情况?

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

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。 table 存在的可能原因是 proc 在 table 超出范围时被删除之前被中断。 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