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