我有一个存储过程,它根据一组可选的搜索条件返回一组分页的结果。该过程使用一个临时表,这样总计数和页数就可以与搜索结果分开返回。
CREATE PROCEDURE [dbo].[Location_SearchAll]
@LocationName varchar(100) = null,
@LocationId varchar(10) = null,
@Address varchar(40) = null,
@City varchar(35) = null,
@StateProvince varchar(2) = null,
@PostalCode varchar(9) = null,
@CountryCode varchar(2) = null,
@PhoneNumber varchar(20) = null,
@ServiceLevel varchar(35) = null,
@Page int = 1,
@ItemsPerPage int = 100
AS
select * into #temp from Locations l
where (l.LocationName like '%' + @LocationName + '%' or @LocationName is null)
and (l.LocationId like '%' + @LocationId + '%' or @LocationId is null)
and (l.AddressLine1 like '%' + @Address + '%' or @Address is null)
and (l.City like '%' + @City + '%' or @City is null)
and (l.StateProvince like '%' + @StateProvince + '%' or @StateProvince is null)
and (l.PostalCode like '%' + @PostalCode + '%' or @PostalCode is null)
and (l.CountryCode like '%' + @CountryCode + '%' or @CountryCode is null)
and (l.Phone like '%' + @PhoneNumber + '%' or @PhoneNumber is null)
and (l.ServiceLevel like '%' + @ServiceLevel + '%' or @ServiceLevel is null);
select count(*) as TotalCount, count(*) / @ItemsPerPage + 1 as TotalPages from #temp;
select * from #temp
order by Id
offset (@Page) * @ItemsPerPage - @ItemsPerPage rows
fetch next @ItemsPerPage rows only;
drop table #temp;
RETURN 0
GO
我注意到,尽管定义了完全相同的搜索条件,但有时这个过程每次返回的结果数不同。结果计数将随着每次后续执行而稳定增加,直到计数最终达到根据搜索条件应返回的实际记录数为止。s,就好像在临时表完全填充之前由select语句返回结果一样。
一些注意事项:
- 这种异常反映在两个select语句中-总计数和返回的结果。
- 我尝试过用一个表变量替换临时表,但也有同样的问题。
我猜这是我在使用临时表方面做的一些愚蠢的事情,但是我似乎找不到任何文档来解释这可能是什么。有什么想法吗?提前感谢。
1条答案
按热度按时间9lowa7mx1#
@Larnu是对的。这是我自己愚蠢的错误。我甚至没有考虑底层数据发生变化的可能性,因为这是一个本地数据库,没有其他人接触它,然后我想起我有一个周期性的ETL计划,每隔几分钟刷新一次表。这就是为什么我的结果集发生变化。
如果我可以删除这个问题并隐藏我的尴尬,我会的,但取而代之的是,我只想感谢@Stu对存储过程改进的简明指导,并希望我的derp时刻防止其他人犯同样的错误。