Эту проблему можно решить с помощью временной таблицы, однако, Я не хочу использовать временную таблицу или таблицу var , этот вопрос в основном для моих личных образовательных целей.
Я унаследовал следующий SQL:
DECLARE @i int = 993
while @i <=1000
begin
declare @lat nvarchar(20)
select top 1 @lat = SUBSTRING(Address,0,CHARINDEX(',',Address,0)) from dbo.rent
where id = @i;
declare @lon nvarchar(20)
select top 1 @lon = SUBSTRING(Address,CHARINDEX(',',Address)+1,LEN(Address)) from dbo.rent
where id = @i
declare @p GEOGRAPHY = GEOGRAPHY::STGeomFromText('POINT('+ @lat +' '+@lon+')', 4326)
select price/LivingArea sq_m, (price/LivingArea)/avg_sq_m, * from
(select (sum(price)/sum(LivingArea)) avg_sq_m, count(1) cnt, @i id from
(select *, GEOGRAPHY::STGeomFromText('POINT('+
convert(nvarchar(20), SUBSTRING(Address,0,CHARINDEX(',',Address,0)))+' '+
convert( nvarchar(20), SUBSTRING(Address,CHARINDEX(',',Address)+1,LEN(Address)))+')', 4326)
.STBuffer(500).STIntersects(@p) as [Intersects]
from dbo.rent
where Address is not null
) s
where [Intersects] = 1) prox
inner join dbo.rent r on prox.id = r.id
set @i = @i+1
end
он используется для анализа цен на недвижимость за квадратный метр, которые находятся рядом, и сравнивает их, чтобы увидеть, какие из них дешевле ...
Проблема: механизм вызова должен быть перемещен с C#
на SQL
, и все запросы должны быть объединены в один результат (теперь вы получаете по одной строке на один во время выполнения), то есть @i
и @p
должен уйти и стать while id < x and id > y
или каким-то волшебным образом соединиться,
процедура является урезанной версией реальной вещи, но, имея решение вышеописанного, у меня не возникнет проблем с тем, чтобы все это работало ...
Я придерживаюсь мнения, что любой механизм SQL с переменными и циклами может быть преобразован в один оператор SQL, поэтому возникает вопрос.
SqlFiddle