Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Постраничная выборка [D7, MSSQL2005]


Empleado ©   (2007-05-21 12:55:00) 

Наверное уже заезженная тема...
Надо: организовать выборку из динамически задаваемых таблиц постранично.
Ограничения: только для SQL2005.

Вот тут покопался немного в доках. В общем - ругайте:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Empleado
-- Description: Returns a paged result set of a SELECT * from a table
-- =============================================
ALTER PROCEDURE [dbo].[spGetPagedData]
-- Add the parameters for the stored procedure here
@TableName nvarchar(128),
@OrderByFields nvarchar(MAX),
@SelectedFields nvarchar(MAX),
@PageNumber int,
@PageSize int
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.
SET NOCOUNT ON;

DECLARE @SQLStmt nvarchar(MAX)
DECLARE @SQLParams nvarchar(MAX)
DECLARE @PageFirstLine int, @PageLastLine int

SET @PageFirstLine = (@PageNumber - 1)* @PageSize + 1
SET @PageLastLine = @PageNumber * @PageSize

SET @SQLStmt = N'WITH CTE_ROWNUMERATOR AS ' + CHAR(13) +
     N'(SELECT ROW_NUMBER() OVER (ORDER BY ' + @OrderByFields + ') AS CTE_RowNum, ' + @SelectedFields + ' ' + CHAR(13) +
    N' FROM ' + @TableName + ') ' + CHAR(13) +
    N'SELECT ' + @SelectedFields + ' ' + CHAR(13) +
    N'FROM CTE_ROWNUMERATOR ' + CHAR(13) +
    N'WHERE CTE_RowNum BETWEEN @PgFrstLine AND @PgLstLine'

SET @SQLParams = N'@PgFrstLine int, @PgLstLine int'
--to debug:
--PRINT @SQLStmt

-- Execute SQL statement
EXECUTE sp_executesql @SQLStmt, @SQLParams,
   @PgFrstLine = @PageFirstLine, @PgLstLine = @PageLastLine
END
/*     Code to test:

DECLARE @SQLStmt nvarchar(MAX)
DECLARE @TableName nvarchar(128)
DECLARE @OrderByFields nvarchar(1024), @SelectedFields nvarchar(1024)
DECLARE @PageNumber int, @PageSize int

SET @TableName = N'HR.Persons'
SET @OrderByFields = N'IDPerson'--'FirstName, LastName'
SET @SelectedFields = N'IDPerson, FirstName, LastName'
SET @PageNumber = 9
SET @PageSize = 5

EXEC spGetPagedData @TableName, @OrderByFields, @SelectedFields, 9, 5
*/


ANB   (2007-05-21 18:07:00) [1]


> т.к. каждый раз надо делать парсинг заново. Так?

парсинг нужно делать только если в процедурном кэше (кстати, он не резиновый, посему запросы надо бы параметризировать) нету уже распарсенного запроса с таким же текстом.


Empleado   (2007-05-21 14:04:00) [2]


> ANB ©   (21.05.07 13:48) [7]

Т.е., пока выполняется запрос с параметром "HR.Persons" как название таблицы, из которой делаем постраничную выборку, то оптимизация есть.
Как только, например другой юзер, вызывает эту SP для другой таблицы, например "HR.Addresses", с другими полями, то оптимизации нет.
И, соответственно, чем больше народа вызывает эту процедуру с отличными друг от друга параметрами, тем оно работает медленнее, т.к. каждый раз надо делать парсинг заново. Так?


ANB   (2007-05-21 13:48:00) [3]


> что из-за этого (из-за exec) не будет никаких оптимизаций
> при работе сервера

Оптимизации будут. При использовании ХП экономится время только на парсинге запроса. Если в динамическом скл запросы параметризированные (текст не меняется) и никакая другая скотина процедурный кэш не замусорила, то парсится запрос будет только один раз.


Empleado   (2007-05-21 13:42:00) [4]


> clickmaker ©   (21.05.07 13:26) [3]

Да мне кажется, что не за что. Тут все просто:
Взял объяснения из хелпа, да переделал это в соответствии с динамически задаваемыми параметрами - имя таблицы, столбцы и т.д..

Но что-то мне подсказывает, что из-за этого (из-за exec) не будет никаких оптимизаций при работе сервера, т.е. не будет достигнут тот performance, как при работе только со stored procedures. Я прав или ошибаюсь?

>Jan1   (21.05.07 13:26) [4]
Сохранил, спасибо.


Jan1   (2007-05-21 13:30:00) [5]

Короче переделал второй вариант, а не сам придумал.


clickmaker   (2007-05-21 13:26:00) [6]


>  В общем - ругайте

а похвалить мона?


Jan1   (2007-05-21 13:26:00) [7]

надеюсь читал?
http://www.sql.ru/faq/faq_topic.aspx?fid=105


Empleado   (2007-05-21 13:10:00) [8]


> Johnmen ©   (21.05.07 13:03) [1]

Goood! Хорошо поругал! мужик!
Предложил бы свой вариант/идею/мысль? Был бы признателен...


Johnmen   (2007-05-21 13:03:00) [9]

Отстой.


Наверх

Титульная страница Поиск, карта сайта Написать письмо