Оптимизатор SQL Server - не работает? - PullRequest
1 голос
/ 12 января 2012

Я обнаружил следующую статью о Более эффективном методе листания по большим наборам результатов

Они говорят:

Уловка оптимизатора, которая также может быть использована в этом сценарии, это когда одна переменная установлена ​​в потенциальный список значений, она получит присвоено значение последнего элемента в списке.

И затем они предоставляют следующий образец:

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 

На основании вышеупомянутой статьи я написал следующую хранимую процедуру T-SQL:

CREATE PROCEDURE Find_Programs

    @programId INTEGER

AS

BEGIN

    SET NOCOUNT ON;
    DECLARE @SelectQuery NVARCHAR(2000)

    DECLARE @first_id INTEGER

    SET @SelectQuery = 'SELECT @first_id = bp.program_id FROM program bp WHERE  bp.program_id >= @programId ORDER BY bp.program_id'
    EXECUTE sp_Executesql @SelectQuery, N'@first_id INTEGER, @programId INTEGER', @first_id, @programId

    PRINT 'first_id: ' + CONVERT(VARCHAR(10),@first_id);

END

но когда я запускаю EXEC dbo.Find_Programs @programId = 0, я не получаю вывод. Кажется, что @first_id не меняет своего значения. Есть идеи почему?

1 Ответ

4 голосов
/ 12 января 2012

Поскольку вы не указали, что @first_id является выходным параметром, вы передаете его в sp_Executesql, но не получаете его обратно. В этой статье объясняется, как использовать выходные параметры с sp_Executesql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...