У Грега Гамильтона есть статья , в которой SET ROWCOUNT
и SELECT
вводятся в переменную, чтобы избежать необходимости ссылаться на ненужные строки, с довольно привлекательной производительностью. Результаты. Тем не менее, MSDN говорит
Если на переменную ссылаются в списке выбора, ей следует присвоить скалярное значение или инструкция SELECT должна возвращать только одну строку.
Но затем он продолжает говорить
Обратите внимание, что эффекты видны только при наличии ссылок среди назначений.
Если инструкция SELECT возвращает более одной строки, а переменная ссылается на нескалярное выражение, переменной присваивается значение, возвращаемое для выражения в последней строке набора результатов.
Указывает, что в этом случае все в порядке (верно?)
Грег заканчивает этим:
CREATE PROCEDURE [dbo].[usp_PageResults_NAI]
(
@startRowIndex int,
@maximumRows int
)
AS
DECLARE @first_id int, @startRow int
-- A check can be added to make sure @startRowIndex isn't > count(1)
-- from employees before doing any actual work unless it is guaranteed
-- the caller won't do that
-- Get the first employeeID for our page of records
SET ROWCOUNT @startRowIndex
SELECT @first_id = employeeID FROM employees ORDER BY employeeid
-- Now, set the row count to MaximumRows and get
-- all records >= @first_id
SET ROWCOUNT @maximumRows
SELECT e.*, d.name as DepartmentName
FROM employees e
INNER JOIN Departments D ON
e.DepartmentID = d.DepartmentID
WHERE employeeid >= @first_id
ORDER BY e.EmployeeID
SET ROWCOUNT 0
GO
Этот метод предполагает, что у вас есть уникальный идентификатор для заказа, я не думаю, что вы можете использовать этот метод как есть при сортировке, скажем, неуникального столбца DateTime.