![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Постраничная выборка [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]Отстой.