Если у вас есть функция atan2 () в вашей математической библиотеке по выбору:
signed_angle = atan2(b.y,b.x) - atan2(a.y,a.x)
Если вы этого не сделаете, что использовать курсор I думаю, вам придется делать это извне (получить таблицу, а затем запустить для каждого оператора и каждый раз вызывать sp) Это то же самое, что и использование курсора, но только вне SQL. Почему вы не используете курсор?
Для SQL Server 2005 и более поздних версий это можно сделать с помощью CROSS APPLY и функции с табличным значением.
Просто для ясности я имею в виду те случаи, когда хранимая процедура может быть преобразована в функцию с табличным значением.
Вы можете сделать что-то вроде этого: упорядочить таблицу, например, по идентификатору клиента (используя образец таблицы AdventureWorks Sales.Customer
), и перебрать этих клиентов с помощью цикла WHILE:
-- define the last customer ID handled
DECLARE @LastCustomerID INT
SET @LastCustomerID = 0
-- define the customer ID to be handled now
DECLARE @CustomerIDToHandle INT
-- select the next customer to handle
SELECT TOP 1 @CustomerIDToHandle = CustomerID
FROM Sales.Customer
WHERE CustomerID > @LastCustomerID
ORDER BY CustomerID
-- as long as we have customers......
WHILE @CustomerIDToHandle IS NOT NULL
BEGIN
-- call your sproc
-- set the last customer handled to the one we just handled
SET @LastCustomerID = @CustomerIDToHandle
SET @CustomerIDToHandle = NULL
-- select the next customer to handle
SELECT TOP 1 @CustomerIDToHandle = CustomerID
FROM Sales.Customer
WHERE CustomerID > @LastCustomerID
ORDER BY CustomerID
END
Это должно работать с любой таблицей, если вы можете определить какой-то ORDER BY
для некоторого столбца.