Sql 基于参数的存储过程执行

Sql 基于参数的存储过程执行,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个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, da

我有一个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
我犯了一个错误

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


如何避免这种情况?

我建议将这些合并到一个单独的语句中:

select Col1, Col2 into #TempTable
from NewTable
where datediff(day, datecol, @date) = 0 and
      (detail = @Value or @Value = 'All')
如果希望针对每个参数值对此进行优化,则可以添加“重新编译”选项

但是,如果性能是一个问题,那么我建议将逻辑写成:

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

其中任何一个都可以利用datecol上的索引。

要快速运行,您可以在过程开始时添加语句删除表(如果存在)。该表存在的可能原因是,当该表超出范围时,在删除该表之前进程被中断。如果代码中存在D.I.E.drop,则可以快速、简单且无成本地实现。像这样的

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

-“详细信息”列中没有“全部”。@kalls。我不知道你的评论指的是什么。我不能做detail=@value或@value='All',因为detail列中没有'All'。我使用“ALL”来排除查询中的条件,而不使用whereclause@kalls . . . 这种逻辑并不是假设细节具有“全部”。这只是比较@value。谢谢。我没有使用SQL Server 2016,如果SQL Server 2016提供了DROP TABLE(如果存在)。谢谢。或者,在2016年之前,您可以通过对象id进行检查,如果存在,则删除。
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