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