如何解决基于参数执行的存储过程
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
我遇到错误
如何避免这种情况?
解决方法
我建议将它们合并为一个语句:
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 举报,一经查实,本站将立刻删除。